를 할 특성 매퍼 특성? Mapper의 매개 변수 인 Type A는 Mapper [A]의 하위 클래스 여야합니다. 어떻게 가능합니까? 아니면이 정의의 의미를 이해하지 못하고있을 수도 있습니다.유형 I은 리프트의 매퍼 및 기록 프레임 워크의 표준 패턴 것으로 보인다 무엇에 의해 의아해하고
2
A
답변
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
레코드의 경우 유형 매개 변수에 표시되는 재귀 종류는 [_F_-bounded po lymorphism] (http://en.wikipedia.org/wiki/Bounded_quantification). generics를 사용하는 대부분의 언어는 Scala와 Java를 포함하여이를 지원합니다. –