為什么下面的方法沒有給出編譯器錯誤?:
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>
。這很好。由于l1
has 型別List<? extends Number>
,它有時可以指向 a List<Integer>
,有時可以指向 a List<Double>
。考慮一個更簡單的例子:
public void func4(Object o1, Object o2) {
o1 = o2;
}
我可以傳遞一個String
作為第一個引數和一個Integer
作為第二個引數,這很好。賦值o1 = o2;
將導致o1
ando2
指向Integer
物件,o1
并且o2
可以這樣做,因為它們具有 type Object
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495746.html
上一篇:如何使用通過嵌入泛型實作的介面