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

但這是爲什麼呢?我的第一個猜測是,編譯器可能不知道T作爲什麼比一個Temporal更具體,因而呼叫t.plus(amount)實際上是Temporal#plus一個調用,它返回一個Temporal,但隨後的呼叫asInstanceOf[T]清楚地表明,編譯器不知道T的具體類型。

採取不同的路線,爲什麼不編譯器知道該呼叫t.plus(amount)旨在進行動態綁定,從而返回一個類型T

回答

0

採取不同的路線,爲什麼編譯器不知道調用t.plus(數量)的目的是動態綁定,從而返回類型T?

因爲它沒有返回T,當然:

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

是一個完全合法的實現。

相關問題