스칼라에서 첫 번째 매개 변수를 매개 변수로 사용하는 다른 매개 변수의 하위 매개 변수를 정의 할 수 있습니다. 예를 들어 Lift에서는 Record and Mapper에서 그러한 것을 찾을 수 있습니다.스칼라 유형 매개 변수 반복
MongoMetaRecord[BaseRecord <: MongoRecord[BaseRecord]]
의미는 무엇이며 어떻게 유용합니까?
스칼라에서 첫 번째 매개 변수를 매개 변수로 사용하는 다른 매개 변수의 하위 매개 변수를 정의 할 수 있습니다. 예를 들어 Lift에서는 Record and Mapper에서 그러한 것을 찾을 수 있습니다.스칼라 유형 매개 변수 반복
MongoMetaRecord[BaseRecord <: MongoRecord[BaseRecord]]
의미는 무엇이며 어떻게 유용합니까?
이것은 추상 클래스가 실제 클래스를 확장하는 실제 클래스의 유형을 알기 쉽게하기 위해 자주 사용되는 패턴입니다. 최종 구체 유형이 무엇인지 파악하는 것이 유용 할 때도 있습니다. 예를 들어 현재 오브젝트의 사본을 생성하는 메소드의 리턴 유형으로 사용하는 경우가 있습니다.
추상 클래스 Abstract
에 구현하려는 구체적인 유형을 알리라고 가정합니다.
trait Abstract[A] {
def copyObject: A = ...
}
을하지만 당신은 당신이 서브 클래스는 임의의 매개 변수화를 제공하지 않는 한 실제로, A
는, Abstract
자체의 서브 클래스해야한다는 인식 : 당신은 어쩌면이 같은 유형의 매개 변수를 정의하여 시작할 수 있습니다.
trait Abstract[A <: Abstract]
을 ...하지만 당신은 곧 Abstract
뿐만 아니라 제네릭 형식으로 전환하고 있다는 것을 깨닫게됩니다, 그래서 당신은 오히려이 필요합니다 : : 그래서 당신이 추가 할 수있는로
trait Abstract[A <: Abstract[A]]
을 최종 콘크리트 클래스에 Abstract
에서 상속 경로를 따라 중간 추상 클래스를 허용하기 위해 마지막 단계는, 당신은 아마, 당신이 할 수있는 경우 A
공변을 할 수 있습니다 :
trait Abstract[+A <: Abstract[A]]
class Concrete1 extends Abstract[Concrete1]
trait RefinedAbstract[+A <: RefinedAbstract[A]] extends Abstract[A]
class Concrete2 extends RefinedAbstract[Concrete2]
이것은 모든 비 리프 (추상) 유형을 매개 변수화해야하고 최종 구체적인 클래스 만 유형 매개 변수를 삭제할 수 있음을 의미합니다.
Java 또는 C#에서도 동일한 작업이 가능합니다. 예 :'SortedStructure>','SortedStructure 여기서 T : IComparable '입니다. –