![](/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.