它成功编译并且运行顺利!
List a=new ArrayList<String>();
a.add(new Integer(5));
有人能解释这个吗?
它成功编译并且运行顺利!
List a=new ArrayList<String>();
a.add(new Integer(5));
有人能解释这个吗?
List a = new ArrayList<String>();
事实上,即使这样也可以编译和运行:
List a = new ArrayList<Date>();
a.add(new Integer(5));
关于泛型和类型擦除的说明:
Java编译器通过一种称为擦除的前端转换来实现泛型。 类型擦除适用于泛型的使用。当使用泛型时,它们被转换为编译时检查和运行时类型转换。
由于类型擦除机制,这段代码:
List<String> a = new ArrayList<String>();
a.add("foo");
String x = a.get(0);
编译后会生成:
List a = new ArrayList();
a.add("foo");
String x = (String) a.get(0);
List a = new ArrayList<String>();
a.add(new Integer(5));
由于类型擦除的缘故,这段代码将被编译为以下形式:
List a = new ArrayList();
a.add(new Integer(5));
int i = a.get(0); // compilation error due to type mismatch
List<Integer> a = new ArrayList<Integer>();
a.add(new Integer(5));
int i = a.get(0);
List a=new ArrayList<Date>();
a.add(new Integer(5));
int i = (Integer) a.get(0);
提示: 注意,在运行时无法找到声明列表对象所使用的特定类型,例如String。
List<String> a = new ArrayList<String>();
a.add(new Integer(5));
你应该这样做
List<String> a = new ArrayList<String>();
a.add(new Integer(5));
String
对象到集合中。有人能解释一下吗?
这是可能的,因为
List a
表示在列表中添加哪些对象没有进行编译时检查。自Java 7以来,您不必为了类型安全而编写List<String> a = new ArrayList<String>()
。您可以简单地使用钻石操作符并使用List<String> a = new ArrayList();
实现相同的效果。
列表a
是一种不带泛型的原始类型。这也是您能够向其中添加整数的确切原因。
为了强制执行正确的行为,请将列表更改为使用泛型。
List<String> a
List<String> a=new ArrayList<String>();
将被更改为您在类文件中看到的内容
List a=new ArrayList();
a
的类型是 List
,它是一个原始列表,你可以向其中添加任何内容。泛型存在是为了实现编译时限制。这意味着,假设你有...List<String> a=new ArrayList<String>();
这行代码将会在编译时出现错误
a.add(new Integer(1)); //error
<String>
类型,并且可以随意对您珍贵的 ArrayList<String>
进行任何操作。”