与泛型的集合

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可以接受任何类型?

这两个声明有什么区别?

Tom*_*icz 9

后一个声明(没有泛型类型)已过时并已弃用.您不应该使用它,它仅为向后兼容性而编译.现代IDE将在此处生成警告.

另请注意,Java仅在编译时强制执行泛型类型,因此从技术上讲,您可以向具有一些额外强制转换的集合添加不正确的类型.这就是为什么最好始终保持泛型并不绕过它们.


Ted*_*opp 5

使用此代码:

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数组列表中的结果.