Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无类型的ArrayList泛型_Java_Generics_Arraylist - Fatal编程技术网

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

它可能是泛型出现在java(我认为是java 4或java 5)之前的遗留物。

泛型只在java 5中添加到java中。在此之前,当您使用集合时,它始终意味着对象的集合。为了向后兼容,旧语法保留原样。因此,
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();