상한이있는 T
매개 변수가있는 클래스를 작성하고 있습니다. 클래스는 반환 형식 T
있는 방법이있다 : 위의반환 유형이 상한 일 때 왜 형 변환이 필요합니까?
import java.time.temporal.{ Temporal, TemporalAmount }
implicit class RichTemporal[T <: Temporal](t: T) {
def + (amount: TemporalAmount): T = t.plus(amount) // error: type mismatch
}
컴파일하지 않습니다; 컴파일러는 형식이 일치하지 불평 : 아래 그림과 같이 내가 명시 적으로 asInstanceOf[T]
호출하면
[error] type mismatch;
[error] found : java.time.temporal.Temporal
[error] required: T
코드는 작동합니다.
import java.time.temporal.{ Temporal, TemporalAmount }
implicit class RichTemporal[T <: Temporal](t: T) {
def + (amount: TemporalAmount): T = t.plus(amount).asInstanceOf[T]
}
하지만이 이유는 무엇입니까? 내 첫번째 추측은 컴파일러가 Temporal
보다 더 구체적 것도 같은 T
을 모를 수도, 따라서 호출 t.plus(amount)
가 Temporal
을 반환 Temporal#plus
를 호출 사실이지만, 다음 호출 asInstanceOf[T]
명확하게 컴파일러가 T
년대 알고 않음을 보여주고 있다는 것입니다 특정 유형.
다른 경로를 사용하는 이유는 컴파일러가 t.plus(amount)
이라는 호출이 동적으로 바인딩되도록 의도되어 있으며 따라서 T
유형을 반환한다는 것을 알지 못합니다.