為什么下面的方法沒有給出編譯器錯誤?:
public void func3(List<? extends Number> l1, List<? extends Number> l2) {
l1 = l2;
}
方法中可能會出現運行時錯誤,但為什么編譯器認為靜態型別l2與l1? (因此,沒有編譯器錯誤)
uj5u.com熱心網友回復:
但是為什么編譯器認為 l2 的靜態型別與 l1 相同?(因此,沒有編譯器錯誤)
因為它們完全相同。變數的編譯時型別l1和l2都是List<? extends Number>.
方法中可能出現運行時錯誤
不,不會發生運行時錯誤。任務是完全安全的。任何可以被型別指向的東西都可以被型別l2指向l1。
由于使用了通配符,它??們的型別可以是任何繼承自 Number 的型別。
我認為您正在考慮這樣一個事實,例如,您可以傳遞 aList<Integer>作為第一個引數和 aList<Double>作為第二個引數。是的,這很好。然后l1將指向List<Integer>并且l2將指向List<Double>。然后當你這樣做時l1 = l2;,你同時做l1并l2指向List<Double>。這很好。由于l1has 型別List<? extends Number>,它有時可以指向 a List<Integer>,有時可以指向 a List<Double>。考慮一個更簡單的例子:
public void func4(Object o1, Object o2) {
o1 = o2;
}
我可以傳遞一個String作為第一個引數和一個Integer作為第二個引數,這很好。賦值o1 = o2;將導致o1ando2指向Integer物件,o1并且o2可以這樣做,因為它們具有 type Object。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495746.html
上一篇:如何使用通過嵌入泛型實作的介面
