考慮以下代碼:
import java.math.BigDecimal;
class Scratch {
public static class Test<N extends Number> {
public void foo(Class<N> numberClass) {
System.out.println(numberClass);
}
public void bar() {
foo(BigDecimal.class);
}
}
public static void main(String[] args) {
Test<Number> t = new Test<>();
t.bar();
}
}
這無法在第 12 行(對 的呼叫foo())上編譯incompatible types: java.lang.Class<java.math.BigDecimal> cannot be converted to java.lang.Class<N>。我不明白,因為泛型Nextends Number,所以我應該能夠傳遞BigDecimal.class給一個接受Class<N>引數的方法。TIA 的任何想法!
uj5u.com熱心網友回復:
假設呼叫者做了:
var t = new Test<Integer>();
t.bar();
然后,bar()將傳遞一個BigDecimalto foo(),它期望一個Integer。
uj5u.com熱心網友回復:
簡短的回答確實是BigDecimal不一定N。這有點令人困惑,因為BigDecimal在<N extends Number>邊界內,但是當前實體的泛型型別引數可以是擴展的任何型別Number,但該bar方法假定BigDecimal.
檢查這個稍微修改過的方法版本:
public void bar() {
new Test<BigDecimal>().foo(BigDecimal.class);
}
該方法編譯。為什么?因為Test<BigDecimal>()有BigDecimalas 型別引數。
當你呼叫 時foo(BigDecimal.class),你假設它this是用BigDecimal作為型別引數實體化的,這并不總是正確的,并且編譯器正在防止錯誤。
在你的代碼中的錯誤將類似于一個假想bar()的方法ArrayList<T>,做add("string"),這將是錯誤的,同樣的原因(實際陣列串列可以被創建,以保持整數,而不是字串,所以里面的代碼不應該假設)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/341025.html
上一篇:具有通用介面的工廠方法
