如何将整数添加到String ArrayList中?

时间:2013-04-25 14:47:46

标签: java arraylist

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

以上代码的引用类型为列表,引用 String 类型的 ArrayList 实例。执行第list.add(1)行时,是不是将1添加到ArrayList(String类型)?如果是,那么为什么允许这样做?

8 个答案:

答案 0 :(得分:15)

您使用了类型擦除,这意味着您已忽略以前设置的通用检查。你可以放弃这个,因为泛型是一个编译时功能,在运行时不会检查。

你和

一样
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

答案 1 :(得分:12)

问题是您的list变量具有原始类型,您可以将任何类型的对象添加到此列表中。要解决此问题,只需将其声明为List的{​​{1}}:

String

答案 2 :(得分:3)

它编译是因为声明List list使用原始类型List,而不是绑定类型List<String>。第二行编译是因为您的list变量可以接受任何内容。第三行编译因为list.get(0)返回Object。第四行没有理由失败。

偶然地,编译代码中没有任何内容导致整数1被强制转换为String。但你不能依赖于此。如果第一行是正确的

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

你的错误会在编译时被发现。

答案 3 :(得分:3)

当您声明如下列表时: List list = new ArrayList<String>() ;

您正在使用所谓的原始类型。它是一个具有泛型类型参数的类型,如List,但您未能提供一个。如果您检查编译器警告,您将看到它告诉您这一点。将参数化类型与原始类型混合通常被认为是编程错误。这没关系:

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

这没关系(但已过时):

List list = new ArrayList();

但是应该避免你写它的方式。

问题是只在编译器时检查泛型,你告诉编译器List,而不是List<String>,所以它会让你把任何你想要的东西放在那里!右侧具有参数的事实并不意味着什么,它是对编译器很重要的实际引用的类型。

答案 4 :(得分:0)

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

不安全列表是指安全的ArrayList

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

Integer(转换为Integer的int 1是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。

答案 5 :(得分:-1)

是...... 1被添加到Array中,因为Java与其他语言一样,实现了原语数据类型的隐式(自动)转换(转换)。

此处提供更多信息Conversions and Promotions

答案 6 :(得分:-3)

试试这个

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

你也可以试试这个

List list = new ArrayList<Object>() ;

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

答案 7 :(得分:-4)

不,因为Java将1视为整数。您需要先使用Integer.toString(n)

将您的号码转换为字符串