Kai*_*Kai 7 java generics arraylist
最近我读了一段对我来说很奇怪的代码.我们知道,当需要使用它们时,我们需要在集合中初始化泛型类型.此外,我们知道集合可以包含集合作为其元素.
代码:
public class Solution {
public static void main(String args[]) {
ArrayList res = returnlist();
System.out.print(res.get(0));
}
public static ArrayList<ArrayList<Integer>> returnlist() {
ArrayList result = new ArrayList();
ArrayList<Integer> content = new ArrayList<Integer>();
content.add(1);
result.add(content);
return result;
}}
Run Code Online (Sandbox Code Playgroud)
我的问题是
ArrayList result = new ArrayList();用来创建一个对象,因为我们没有给集合提供实际的元素类型.result.add(content);集合来添加集合"结果"只是一个简单的集合.我们没有把它定义为一个ArrayList的ArrayListHar*_*han 12
只是加起来提供总结答案
旧方式:
(A) ArrayList result = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
将创建一个Arraylist来持有"对象"
新方法 :
ArrayList<Integer> content = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
这代表一个Arraylist,它将保存"整数"对象.这是为编译时类型检查目的而引入的.
为什么?
考虑第一种情况.它的输入类型是Object.我们知道Object是所有类的超类.我们可以传入Integer对象,String对象等.在获取数据时,开发人员必须执行正确的类型转换.假设开发人员最初认为代码将接受Integer对象,那么他在获取数据时添加以下类型转换
Integer integer=(Integer) content.get(0);
Run Code Online (Sandbox Code Playgroud)
这应该有效.但是,如果他错误地传递了一个字符串,则会导致运行时错误.
如何避免?
通过引入编译时检查
这个怎么运作 ?
当我们指定参数化类型时,只能将Integer对象添加到ArrayList集合中.否则它会显示错误.
content.add(3); // will work
content.add("HARSHAD"); // error shown
Run Code Online (Sandbox Code Playgroud)
如果参数化泛型类型用于类型检查目的,如何从列表中检索正确的数据?
编译器隐式执行类型转换.请参阅示例代码
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
Integer integer=list.get(0);
System.out.println(integer);
Run Code Online (Sandbox Code Playgroud)
执行编译时编译器实际执行的操作是什么?
//perform type erasure
(B) List list=new ArrayList();
list.add(1);
list.add(2);
// the arraylist inturn accepts Object when you run the code
//add casting
Integer integer=(Integer)list.get(0);
Run Code Online (Sandbox Code Playgroud)
结论
如果你看到代码(A)和(B)都是相同的.唯一的区别是在第二种情况下,编译器隐式地执行相同的操作.
最后回答你的问题......
ArrayList result = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
允许出于向后兼容的目的.虽然不建议这样做.
来自Oracle文档的官方链接解释了相同的概念.
| 归档时间: |
|
| 查看次数: |
15267 次 |
| 最近记录: |