java如何将整数添加到字符串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(字符串类型)中吗?如果是,为什么允许这样做
你可以在下面搜索框中键入要查询的问题!
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(字符串类型)中吗?如果是,为什么允许这样做
# 1 楼答案
是的。。。1被添加到数组中,因为Java和其他语言一样,实现了原语数据类型的隐式(自动)转换(转换)
更多信息请点击这里Conversions and Promotions
# 2 楼答案
当您声明这样的列表时:
List list = new ArrayList<String>() ;
您使用的是所谓的原始类型。它是一个具有泛型类型参数(如List)的类型,但您未能提供一个。如果您检查编译器警告,您将看到它正在告诉您这一点。将参数化类型与原始类型混合通常被认为是编程错误。这没关系:
List<String> list = new ArrayList<String>() ;
这还可以(但已经过时):
List list = new ArrayList();
但是你写它的方式应该避免
问题是泛型只在编译器时被检查,并且您告诉编译器
List
,而不是List<String>
,因此它将允许您在其中放入任何您想要的内容!右边有参数这一事实实际上并不意味着什么,编译器关心的是实际引用的类型# 3 楼答案
您使用了类型擦除,这意味着您忽略了以前设置的常规检查。因为泛型是一种编译时特性,在运行时不会被检查,所以您可以不受影响
你有什么一样的
或
如果查看编译器生成的字节码,就无法区分它们之间的区别
有趣的是,你可以做到这一点
# 4 楼答案
不安全列表指的是安全的ArrayList
不是添加到列表中的字符串的整数(int 1转换为整数是自动装箱)
强制转换是必需的,因为不安全列表可以包含任何内容
整数。调用了toString()
对。整数已添加到假定包含字符串的ArrayList中
向后兼容性。Java必须支持预泛型代码
名单;意味着它不安全,因此您可以对它执行任何操作,而引用的ArrayList()必须容忍这种情况
寓意:不要忽略编译器警告,否则Integer可能会进入假定包含字符串的ArrayList
# 5 楼答案
问题是
list
变量具有原始类型,您可以将任何类型的对象添加到此列表中。要解决此问题,只需将其声明为String
的List
:# 6 楼答案
它之所以编译,是因为声明
List list
使用原始类型List
,而不是绑定类型List<String>
。第二行编译是因为list
变量可以接受任何内容。第三行编译是因为list.get(0)
返回Object
。第四行没有失败的理由意外地,编译代码中没有任何内容导致整数1被转换为
String
。但你不能依赖于此。第一行是正确的吗您的错误会在编译时被发现