2012-03-13 2 views
5

스칼라에서 첫 번째 매개 변수를 매개 변수로 사용하는 다른 매개 변수의 하위 매개 변수를 정의 할 수 있습니다. 예를 들어 Lift에서는 Record and Mapper에서 그러한 것을 찾을 수 있습니다.스칼라 유형 매개 변수 반복

MongoMetaRecord[BaseRecord <: MongoRecord[BaseRecord]] 

의미는 무엇이며 어떻게 유용합니까?

+3

Java 또는 C#에서도 동일한 작업이 가능합니다. 예 :'SortedStructure >','SortedStructure 여기서 T : IComparable '입니다. –

답변

9

이것은 추상 클래스가 실제 클래스를 확장하는 실제 클래스의 유형을 알기 쉽게하기 위해 자주 사용되는 패턴입니다. 최종 구체 유형이 무엇인지 파악하는 것이 유용 할 때도 있습니다. 예를 들어 현재 오브젝트의 사본을 생성하는 메소드의 리턴 유형으로 사용하는 경우가 있습니다.

추상 클래스 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] 

이것은 모든 비 리프 (추상) 유형을 매개 변수화해야하고 최종 구체적인 클래스 만 유형 매개 변수를 삭제할 수 있음을 의미합니다.

관련 문제