Java 无类型的ArrayList泛型
最近我读了一段代码,我觉得很奇怪。正如我们所知,当我们需要使用集合时,我们需要初始化集合中的泛型类型。此外,我们知道集合可以包含集合作为其元素 守则:Java 无类型的ArrayList泛型,java,generics,arraylist,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<
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;
}}
公共类解决方案{
公共静态void main(字符串参数[]){
ArrayList res=returnlist();
系统输出打印(res.get(0));
}
公共静态ArrayList returnlist(){
ArrayList结果=新建ArrayList();
ArrayList内容=新建ArrayList();
增加第(1)款;
结果.添加(内容);
返回结果;
}}
我的问题是
- 为什么我们可以使用
ArrayList result=new ArrayList()代码>创建一个对象,因为我们没有给集合提供元素的实际类型
- 为什么我们可以使用
result.add(content)代码>将集合添加到集合“result”的集合只是一个普通集合。我们没有将其定义为
的ArrayList
ArrayList
ArrayList result=new ArrayList()
实际上正在创建一个ArrayList
。由于ArrayList也是一个对象,因此可以将内容
添加到变量结果
为什么我们可以使用ArrayList result=new ArrayList()
创建一个对象,因为我们没有给集合提供元素的实际类型
因为java希望它向后兼容。泛型更多的是编译器的特性,以确保类型安全,集合可以在运行时存储任何类型的对象
Java编译器不会为此向您提供编译器错误,但它必须向您提供编译器警告,即使用不带类型的泛型类是不安全的。Java泛型集合不与类型一起存储,以确保与J2SE 5.0之前的版本向后兼容。添加到泛型集合时,类型信息将被删除。这就是所谓的 这意味着可以将泛型集合分配给非泛型引用,并且泛型类型集合中的对象可以放置在非泛型、非类型集合中 Java泛型真正做的就是确保您不能将错误的类型添加到泛型列表中,并避免执行强制转换检索;即使它仍然完成了 更进一步
- 的Java部分对我刚才所说的内容进行了更深入的探讨
- 还以更完整的方式基本上涵盖了您所要求的内容
- 与
(A) ArrayList result = new ArrayList();
将创建一个Arraylist来保存“Object”
新方式:
ArrayList<Integer> content = new ArrayList<Integer>();
这应该是有效的。但是,如果他错误地传递字符串,将导致运行时错误
如何避免
通过引入编译时检查
它是如何工作的 指定参数化类型时,只能将整数对象添加到ArrayList集合。否则它将显示错误
content.add(3); // will work
content.add("HARSHAD"); // error shown
如果参数化泛型类型用于类型检查,如何从列表中检索正确的数据
编译器隐式地执行类型转换。请参阅示例代码
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
Integer integer=list.get(0);
System.out.println(integer);
结论 如果您看到代码(A)和(B)都是相同的。唯一的区别是,在第二种情况下,编译器隐式地执行相同的操作 最后回答你的问题
ArrayList result = new ArrayList();
允许用于向后兼容目的。尽管不建议这样做
解释同一概念的官方链接。不一定是残余,但肯定是不使用泛型的功能。当你得到这些物品时,你必须在结果上使用它们。是的。似乎我们需要在没有泛型的情况下处理存储在ArrayList中的东西。有意义。但是,在日常编程中使用不带泛型的集合仍然是一种流行的方式吗?不推荐用于新代码。但是有很多代码是在Java5之前编写的,在维护甚至扩展这些代码时,人们倾向于使用旧的风格,因为我没有足够的声誉给你打分。英雄联盟
//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);
ArrayList result = new ArrayList();