2016-07-13 2 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 
} 

コンパイルされないと、コンパイラは型の不一致を訴える:

[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が返されますか?

答えて

0

コンパイラは、t.plus(amount)の呼び出しが動的にバインドされることを知っていないので、タイプTを返します。

それはもちろん、Tを返す必要はありませんので:

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

は完全に合法的な実装です。

関連する問題