![](/img/trans.png)
[英]How can I convert arraylist <String> to arraylist <integer>
[英]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
變量具有原始類型,您可以將任何類型的對象添加到此列表中。 要解決這個問題,只需將其聲明為String
的List
:
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.