[英]What's wrong with the following assignment in Java Generics
我只是從Java Generics開始,以下代碼對我沒有任何意義。
List<? extends Number> lint = new ArrayList<Integer>();
// following throws error
List<Number> lint2 = lint;
我知道List<Interger> != List<Number>
但是'?'的用途是什么? 接線員呢? 我創建了一個整數數組列表,並將其傳遞給一些可以接受包含雙精度,浮點數或整數的列表的列表。 我為什么不能將此分配給列表。 所有這些都可以歸因於嚴格的安全性嗎?
我以此為參考: http : //docs.oracle.com/javase/tutorial/java/generics/upperBounded.html
簡單,
List<Integer>
是不是一個亞型List<Number>
即使Integer
是的子類型Number
。
對於Number
任何子類( ? extends Number
)為Integer
。
查看更多泛型,繼承和子類型
原因很簡單: lint
是一個ArraysList<Integer>
,即lint.add(10)
是正確的, lint.add(2.5)
是錯誤的。
但是如果Java編譯器接受List<Number> lint2 = lint;
, lint2.add(2.5)
應該可以接受,因為2.5
是一個Number
,並且可以將Double
放入Integer
列表中。
希望現在更清楚...
/ **抽象類Number是BigDecimal,BigInteger,Byte,Double,Float,Integer,Long和Short類的超類。 * /
/ ** Number的子類必須提供將表示的數值轉換為byte,double,float,int,long和short的方法。
所以你必須輸入強制轉換* /
List<? extends Number> lint = new ArrayList<Integer>();
List<Number> lint2 = (List<Number>) lint;
lint2.add(123);
lint2.add(1234);
System.out.println(lint2);
lint是ArrayList()類型,而lint2是List()類型。在這里您可以說ArrayList是List的子類,因此
List l1 = new ArrayList();
就像Integer是Number的子類一樣,所以
Number i = new Integer(5);
但是List<Number> != List<Integer>
這就是它給出錯誤的原因。 他們是不同的。
在lint2中,可以添加Number的任何子級。 皮棉里沒有這樣的東西。 作為一個不知道具體?
lint.add(new Integer(3000)); // Error too
因此,將“?extended T”讀作特定(未知)類型。 僅用於閱讀數字,不用於書寫。
List<Number>
和List<? extends Number>
List<? extends Number>
。 因此,您不能直接將lint
分配給lint2
,應將其lint2
為List<Number>
類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.