여기에는 두 특성, 이전 특성으로 경계가 지정된 공변 유형 매개 변수가있는 클래스 및 다른 클래스로 묶인 형식 매개 변수가있는 두 번째 특성을 사용하는 간단한 설정이 나와 있습니다. 두 클래스 모두에 대해 두 가지 특성 중 하나가 type 매개 변수 밑에있는 경우에만 특정 메서드를 사용할 수 있습니다 (암시 적 증거를 통해). 이 잘 컴파일 : 그러나스칼라 : 형식 매개 변수를 사용하는 클래스의 암시 적 증거
trait Foo
trait ReadableFoo extends Foo {def field: Int}
case class Bar[+F <: Foo](foo: F) {
def readField(implicit evidence: F <:< ReadableFoo) = foo.field
}
case class Grill[+F <: Foo, +B <: Bar[F]](bar: B) {
def readField(implicit evidence: F <:< ReadableFoo) = bar.readField
}
, Bar
이 F
에, 나는 Grill
에서 F
매개 변수를 필요가 없습니다 공변 때문이다. 그저 B
이 Bar[ReadableFoo]
의 하위 유형 일 것을 요구해야합니다. 이 그러나 실패 : 오류가있는
case class Grill[+B <: Bar[_]](bar: B) {
def readField(implicit evidence: B <:< Bar[ReadableFoo]) = bar.readField
}
:
error: Cannot prove that Any <:< this.ReadableFoo.
def readField(implicit evidence: B <:< Bar[ReadableFoo]) = bar.readField
가 왜 암시 적 증거가 고려되고 있지?
나는 <잘 모르겠어요 : <호출하기위한 것입니다, 첫 번째 매개 변수가 두 번째 매개 변수의 하위 유형 인 경우 존재하는 값. 구현은 기본적으로 신원 기능입니다. 이 예제는 기본적으로 컴파일러가 readField 메소드의 암시 적 매개 변수를 찾는 데 도움이되는 (안전한) 유형 변환을 수행하기 때문에 작동합니다. – Kaito
@Kaito :''<''''apply''는 호출 할 의도가 없다는 증거가 있습니까? 그것은 [문서화 된 동작]입니다 (http://www.scala-lang.org/api/rc/scala/Predef$$$less$colon$less.html). '(bar : Bar [ReadableFoo]). readField'라고 쓰면 암시 적 변환이 자동으로 시작되지만 Sciss의 버전은 나에게 더 깨끗하게 느껴진다. –
@TravisBrown : 없음 그러나 실제로 Functional1 특성에 대한 설명을 상속받은 사실을 구두로 문서화하는 라인을 찾을 수는 없습니다. 그 행동에 의지 할 수 있는지 잘 모르겠지만, 다음 버전에서는 예외를 던질 수도 있습니다. – Kaito