パラメータ化されたタイプ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]
}
これはなぜですか?私の最初の推測では、コンパイラがTemporal
より具体的なものとしてT
を知らないかもしれないので、コールt.plus(amount)
がTemporal
を返しTemporal#plus
への呼び出しが実際にあるが、その後コールasInstanceOf[T]
は明らかにコンパイラがT
年代を知らないことを示すということです特定のタイプ。
異なるルートを使用すると、なぜt.plus(amount)
という呼び出しが動的にバインドされることがコンパイラによって認識されないため、タイプT
が返されますか?