繁体   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