ArrayList Generic没有Type

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);集合来添加集合"结果"只是一个简单的集合.我们没有把它定义为一个ArrayListArrayList

Har*_*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文档的官方链接解释了相同的概念.


Ros*_*rew 10

Java泛型集合不与类型一起存储,以确保与J2SE 5.0之前的向后兼容性.添加到通用集合时,将删除类型信息.这称为类型擦除.

这意味着可以将泛型集合分配给非泛型引用,并且可以将泛型类型集合中的对象放置在非泛型的非类型集合中.

所有Java泛型实际上都确保您不能将错误的类型添加到通用列表中,并使您免于对检索进行显式强制转换; 即使它仍然是隐含的.

除此之外