Lol*_*lly 5 java arrays generics collections
我有一个关于将泛型与集合一起使用的问题.
ArrayList<Integer> al=new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
我们知道上面的行意味着ArrayList
al
仅限于只保留整数.因此,以下行给出了编译错误:
al.add("wwww");
Run Code Online (Sandbox Code Playgroud)
但是我不明白下面这行是什么意思,
ArrayList al=new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
在ArrayList<Integer>
宣布时我们不在左侧给出的地方.现在,以下行不会出现编译错误:
al.add("wwww");
Run Code Online (Sandbox Code Playgroud)
所以,如果我宣布像
ArrayList al=new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
这意味着a1
可以接受任何类型?
这两个声明有什么区别?
后一个声明(没有泛型类型)已过时并已弃用.您不应该使用它,它仅为向后兼容性而编译.现代IDE将在此处生成警告.
另请注意,Java仅在编译时强制执行泛型类型,因此从技术上讲,您可以向具有一些额外强制转换的集合添加不正确的类型.这就是为什么最好始终保持泛型并不绕过它们.
使用此代码:
ArrayList al = new ArrayList<Integer>();
a1.add("www");
Run Code Online (Sandbox Code Playgroud)
编译器将生成一个警告(你应该注意!)但代码将运行没有错误.问题来自于从中提取数据a1
.如果您"知道"它包含Integer
值,您可以这样做:
Integer val = (Integer) a1.get(index);
Run Code Online (Sandbox Code Playgroud)
但是当你击中"www"
元素时,你会得到一个ClassCastException
.泛型用于将这些错误移动到编译时,而不是强迫可怜的开发人员追踪String
值在该Integer
数组列表中的结果.