2016-11-25 104 views
3

下面的代碼是拋出編譯時異常Java泛型:類型不匹配:不能從整數轉換到K

類型不匹配:不能從整數轉換到K

我明白了什麼是K應如何處理任何值爲Number

public <K extends Number> K getValue(){ 
    Integer a = new Integer(1); 
    return a;//Type mismatch: cannot convert from Integer to K 
} 

(注:這只是一個測試代碼,把我的問題沒有給我的實際情況的不相關的細節)

+1

編譯器是正確的。例如,在調用此方法的某個時刻,您將定義「K」的實際類型,例如「K」可以定義爲「Double」。在這種情況下,K不會是一個整數,你的代碼會出錯。這裏誤解了「擴展」的含義。換句話說,您沒有任何保證,因爲'K'擴展了Number,K將是一個整數,它可以是一個Double或者一個Float或任何其他正交類型來擴展數字。 –

+0

如果它是''的話。它仍會給我同樣的警告信息。 – ManishKr

+0

[這](http://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super)將可能有助於瞭解事情做得更好。 – biziclop

回答

3

這裏的問題是,K是擴展Number一個類型,但它是未知子類的Number這就是爲什麼,因爲Integer只有一個特定的子類的Number因此它不能與任何潛在的目標類型匹配,編譯器將引發此錯誤。

比方說,你要投它明確地使其與

public <K extends Number> K getValue(){ 
    Integer a = new Integer(1); 
    return (K) a; 
} 

編譯然後,如果你把它期待的任何子類的Number除了Integer你會得到一個ClassCastException,這正是編譯器是什麼要避免:

Double d = getValue(); <-- throws ClassCastException 

至於解決方法,你可以定義使用Number作爲返回類型的方法,下一個:

public Number getValue() { 
    return new Integer(1); 
} 
+0

所以它是否意味着'extends'不應該是返回類型的一部分,如果它沒有收集?並改用Superclass。 – ManishKr

+0

在這種情況下,是的,我相信是這樣 –

+0

我同意@biziclop,在總結'extends'應在集合的情況下,可以使用,但正常的分配和返回類型使用'SuperClass'。 – ManishKr

相關問題