簡體   English   中英

Java Generics中的以下分配有什么問題

[英]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 ,應將其lint2List<Number>類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM