我正在编写一个具有参数化类型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
}
以上不编译;编译器抱怨类型不匹配:
[error] type mismatch;
[error] found : java.time.temporal.Temporal
[error] required: T
该代码仅在我明确调用asInstanceOf[T]
时才有效,如下所示。
import java.time.temporal.{ Temporal, TemporalAmount }
implicit class RichTemporal[T <: Temporal](t: T) {
def + (amount: TemporalAmount): T = t.plus(amount).asInstanceOf[T]
}
但为什么会这样呢?我的第一个猜测是编译器可能不知道T
比Temporal
更具体,因此调用t.plus(amount)
实际上是对Temporal#plus
的调用,它返回{ {1}},但调用Temporal
清楚地表明编译器确实知道asInstanceOf[T]
的特定类型。
采用不同的路径,为什么编译器不知道调用T
是动态绑定的,因此返回类型t.plus(amount)
?
答案 0 :(得分:0)
采用不同的路径,为什么编译器不知道调用t.plus(amount)是为了动态绑定,从而返回类型T?
因为它当然不必返回T
:
class MyTemporal extends Temporal {
def plus(amount: TemporalAmount): Temporal = Instant.now()
// other methods
}
是完全合法的实施。