2017-03-28 105 views
0

將字符串元素添加到整數ArrayList中據我所知,ArrayList的 .add方法不能將String元素添加到整數ArrayList中。 例如,爲什麼你可以使用方法

import java.util.ArrayList; 


public static void main (String...args){ 
    ArrayList<Integer>lst = new ArrayList<Integer>(); 
    lst.add("ab"); 
    System.out.println(lst.get(0)); 
    } 
} 

無法編譯。

但如果你單獨的方法,

import java.util.ArrayList; 


public class Test { 
    public static void addToList(ArrayList a){ 
    a.add("abcd"); 
    } 

public static void main (String...args){ 

    ArrayList<Integer>lst = new ArrayList<Integer>(); 

    addToList(lst); 
    System.out.println(lst.get(0)); 
    } 
} 

這將打印 「ABCD」 沒有問題。

爲什麼你實際上可以通過使用方法將字符串添加到整數ArrayList?

+0

數組列表 – Beginner

+1

'addToList(ArrayList a)'是一個[** raw type **](https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html)。不要使用***原始類型***。 –

+1

我的理解是,Java泛型被設計爲讓你這樣做的原因是,它們不會在預先通用的Java中破壞現有的程序,因爲當所有東西都必須被施放時。教訓 - 不要使用***原始類型***(有沒有人說過呢?) –

回答

0

爲什麼您可以通過使用方法實際將字符串添加到整數ArrayList?

這是因爲在運行時,不會有類型。類型擦除將會發生,並且您的數組列表變得通用。

在你的第一種情況下,編譯器會將簽到。

爲什麼編譯器在第二種情況下失敗,原因是您曾與一個ArrayList出一種

public static void addToList(**ArrayList** a){ 
    a.add("abcd"); 
    } 

因此,你可以添加任何東西它。

2

在第二個示例中,在將ArrayList傳遞給該方法時,已刪除泛型類型。

由於Java在運行時不強制泛型,因此只能用作Object,因此您可以傳遞任何您想要的內容。

0

歡迎來到java泛型的樂趣。對此的回答是因爲您不僅分離了方法,而且還將方法聲明爲原始類型而不是ArrayList。如果你已經將它包含在你的函數名中,它將不會編譯,因爲編譯器將能夠檢測到不匹配的類型。

其原因被稱爲類型擦除,並且會發生什麼情況是java字節代碼實際上並不包含您提供給編譯器的所有信息。該字節代碼只包含原始類型ArrayList,並且導致編譯器錯誤的參數化爲開發人員提供了方便,以幫助防止類型轉換相關的錯誤。因此,如果使用原始類型引用,則實際上可以將任何類型的對象放在Collection中。但是,不要這樣做,因爲你只是要求麻煩,並且出於顯而易見的原因,堅持使用編譯器輔助是最佳實踐。

0

在你第二個樣品,原始類型變量a = new ArrayList<Integet>,就像子類擴展超類,它可以調用方法屬於超類,也許因爲你沒有指定的該類型不需要檢查類型

相關問題