2016-07-13 3 views
0

상한이있는 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 유형을 반환한다는 것을 알지 못합니다.

답변

0

컴파일러는 t.plus (amount) 호출이 동적으로 바인딩되도록 의도했기 때문에 형식 T를 반환하지 않는 이유는 무엇입니까?

은 물론, T을 반환하지 않기 때문에

:

class MyTemporal extends Temporal { 
    def plus(amount: TemporalAmount): Temporal = Instant.now() 
    // other methods 
} 

은 완벽하게 합법적 구현입니다.

관련 문제