簡體   English   中英

如何將整數添加到String ArrayList中?

[英]How can an Integer be added to a String ArrayList?

List list = new ArrayList<String>() ;
list.add(1) ;
Integer hello = (Integer) list.get(0) ;
System.out.println(hello);

上面的代碼有一個類型為List的引用,引用了String類型的ArrayList實例。 當行list.add(1)被執行時,是不是1添加到ArrayList(String類型)? 如果是,那么為什么允許這樣做?

您已使用類型擦除,這意味着您已忽略以前設置的通用檢查。 你可以放棄這個,因為泛型是一個編譯時功能,在運行時不會檢查。

你有什么相同的

List list = new ArrayList() ;
list.add(1) ;
Integer hello = (Integer) list.get(0) ;
System.out.println(hello);

要么

List<Integer> list = new ArrayList<Integer>() ;
list.add(1) ;
Integer hello = list.get(0); // generics add an implicit cast here
System.out.println(hello);

如果查看編譯器生成的字節代碼,就無法區分它們。

有趣的是,你可以做到這一點

List<String> strings = new ArrayList<String>();
@SuppressWarnings("unchecked");
List<Integer> ints = (List) strings;
ints.add(1);

System.out.println(strings); // ok
String s= strings.get(0); // throws a ClassCastException

問題是您的list變量具有原始類型,您可以將任何類型的對象添加到此列表中。 要解決這個問題,只需將其聲明為StringList

List<String> list = new ArrayList<String>() ;

它編譯是因為聲明List list使用原始類型List ,而不是綁定類型List<String> 第二行編譯因為您的list變量可以接受任何內容。 第三行編譯,因為list.get(0)返回Object 第四行沒有理由失敗。

偶然,編譯代碼中沒有任何內容導致Integer 1被強制轉換為String 但你不能依賴於此。 如果第一行是正確的

List<String> list = new ArrayList<>();

你的錯誤會在編譯時被捕獲。

當您聲明如下列表時: List list = new ArrayList<String>() ;

您正在使用所謂的原始類型。 它是一個具有泛型類型參數的類型,如List,但您未能提供一個。 如果您檢查編譯器警告,您將看到它告訴您這一點。 將參數化類型與原始類型混合通常被認為是編程錯誤。 還行吧:

List<String> list = new ArrayList<String>() ;

這是好的(但已經過時):

List list = new ArrayList();

但是應該避免你寫它的方式。

問題是泛型只在編譯時檢查,你告訴編譯器List ,而不是List<String> ,所以它會讓你把任何你想要的東西放在那里! 右側具有參數的事實並不意味着什么,它是對編譯器重要的實際引用的類型。

List list = new ArrayList<String>() ; // WARNING!!!

不安全的List指的是安全的ArrayList

list.add(1) ;  // WARNING!!!

Integer(int 1轉換為Integer是Autoboxing)不是添加到List的String

Integer hello = (Integer) list.get(0) ;

需要強制轉換,因為不安全的List可以包含任何內容。

System.out.println(hello);

調用Integer.toString()

當行list.add(1)被執行時,是不是1添加到ArrayList(String類型)?

是。 Integer被添加到一個應該包含String的ArrayList中。

如果是,那么為什么允許這樣做?

向后兼容性。 Java必須支持預通用代碼。

清單清單; 意味着它是不安全的,所以你可以用它做任何事情,並且引用的ArrayList()必須容忍它。

道德:不要忽略編譯器警告,否則Integer可能會進入一個應該包含字符串的ArrayList。

是的... 1加入了Array,因為Java與其他語言一樣,實現了基元數據類型的隱式(自動)轉換(轉換)。

更多信息在此處轉換和促銷

試試這個

List.add(Integer.toString(1));

你也可以試試這個

List list = new ArrayList<Object>() ;

如果不需要arraylist必須是String的Arraylist

不,因為Java將1視為整數。 您需要首先使用Integer.toString(n)將您的數字轉換為字符串

暫無
暫無

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

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