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]
}
但這是爲什麼呢?我的第一個猜測是,編譯器可能不知道T
作爲什麼比一個Temporal
更具體,因而呼叫t.plus(amount)
實際上是Temporal#plus
一個調用,它返回一個Temporal
,但隨後的呼叫asInstanceOf[T]
清楚地表明,編譯器不知道T
的具體類型。
採取不同的路線,爲什麼不編譯器知道該呼叫t.plus(amount)
旨在進行動態綁定,從而返回一個類型T
?