Java - ArrayList和ArrayList <object>是两个不同的类吗?</object>

时间:2012-02-20 04:13:48

标签: java generics arraylist

如果是这样,两者有什么区别?在Java库中实际上有两个单独的类定义吗?一个用于旧的ArrayList,另一个用于新的通用的?这纯粹是好奇心的问题。

6 个答案:

答案 0 :(得分:6)

只有一个类ArrayList,但它支持泛型,这意味着您可以使用类型对其进行注释。但是,这是可选的(主要是为了向后兼容),因此您也可以继续使用原始类型(但不鼓励这样做)。

请注意,Java泛型只发生在编译器上,在运行时,ArrayList实例本身不知道您为其分配了什么泛型类型。这意味着如果您对其进行注释,它在内部的工作方式完全相同。

与数组不同,通用集合没有新的单独类。因此,虽然Integer[]实际上与String[](或Integer[][])不同,但ArrayList<String>的类与ArrayList<Integer>的类相同(和ArrayList<?>以及ArrayListArrayList<List<Integer>>)。

与数组不同,集合使用的泛型没有什么特别之处(尽管这仍然是他们最受欢迎的应用程序)。相同的机制可以用于完全不同的东西,例如Callable。

答案 1 :(得分:4)

不,它们是同一个类,因为只有一个类文件。现有的API类被“格式化”,以至于旧代码可以继续编译而无需更改,并且可以与使用新功能的新代码很好地互操作。

答案 2 :(得分:1)

它们是同一个类,实际上差异仅存在于类型检查器中。

ArrayList<T>只是编译器的一个注释,可以强制只将T类型的对象添加到特定列表中,因此它会自动允许您从集合中检索已经存在的对象类型为T

此机制称为 参数多态 ,自版本5以来已添加到Java中,并通过类型擦除实现:编译器将确保您使用正如您所定义的那样,只使用正确类型的类,但在运行时将使用旧的ArrayList

他们确实是同一个班级。

答案 3 :(得分:1)

他们是一样的。通用类型限制在编译时强制执行,但在运行时实际上不存在类型信息。这称为类型擦除,这意味着在运行时,实际上无法确定声明实例的泛型类型。有关详细信息,请参阅this Wikipedia page

答案 4 :(得分:1)

ArrayList<Object> a1 = new ArrayList<Object>();
ArrayList a2 = new ArrayList();

boolean same = a1.getClass().equals(a2.getClass());
System.out.println("same="+same);

打印“true”。两个数组实际上都是同一类的对象。

答案 5 :(得分:1)

  • ArrayList:已过时(未参数化)。 仅用于向后兼容。生成警告。

  • ArrayList<Object>:基于数组的对象列表。

  • ArrayList<? extends Object>:某种Object 的基于数组的列表
    例如,可以指代ArrayList<Integer>ArrayList<String>或仅仅ArrayList<Object>