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类型)?如果是,那么为什么允许这样做?
答案 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)