2012-09-13 2 views
2

를 할 특성 매퍼 특성? Mapper의 매개 변수 인 Type A는 Mapper [A]의 하위 클래스 여야합니다. 어떻게 가능합니까? 아니면이 정의의 의미를 이해하지 못하고있을 수도 있습니다.유형 I은 리프트의 매퍼 및 기록 프레임 워크의 표준 패턴 것으로 보인다 무엇에 의해 의아해하고

+1

레코드의 경우 유형 매개 변수에 표시되는 재귀 종류는 [_F_-bounded po lymorphism] (http://en.wikipedia.org/wiki/Bounded_quantification). generics를 사용하는 대부분의 언어는 Scala와 Java를 포함하여이를 지원합니다. –

답변

2

이 패턴은 Mapper의 실제 하위 유형을 캡처 할 수 있으며, 이는 메소드에서 해당 유형의 인수를 받아 들일 때 유용합니다. 당신이 정확한 유형에 액세스 할 때 당신이 할 수 있지만

scala> trait A { def f(other: A): A } 
defined trait A 

scala> class B extends A { def f(other: B): B = sys.error("TODO") } 
<console>:11: error: class B needs to be abstract, 
since method f in trait A of type (other: A)A is not defined 
(Note that A does not match B) 
    class B extends A { def f(other: B): B = sys.error("TODO") } 

:

scala> trait A[T <: A[T]] { def f(other: T): T } 
defined trait A 

scala> class B extends A[B] { def f(other: B): B = sys.error("TODO") } 
defined class B 

참고이 제한된 유형의 멤버로도 가능하다는 것을

전통적으로 해당 제약 조건을 선언 할 수 없습니다 :

trait A { type T <: A; def f(other: T): T } 
class B extends A { type T <: B; def f(other: T): T = sys.error("TODO") } 
+0

재미있는 종속 메서드 유형에 대한 Miles Sabin의 대답을 찾을 수도 있습니다. http://stackoverflow.com/questions/7860163/what-are-some-compelling-use-cases-for-dependent-method-types – ron