如果是这样,两者有什么区别?在Java库中实际上有两个单独的类定义吗?一个用于旧的ArrayList,另一个用于新的通用的?这纯粹是好奇心的问题。
答案 0 :(得分:6)
只有一个类ArrayList
,但它支持泛型,这意味着您可以使用类型对其进行注释。但是,这是可选的(主要是为了向后兼容),因此您也可以继续使用原始类型(但不鼓励这样做)。
请注意,Java泛型只发生在编译器上,在运行时,ArrayList实例本身不知道您为其分配了什么泛型类型。这意味着如果您对其进行注释,它在内部的工作方式完全相同。
与数组不同,通用集合没有新的单独类。因此,虽然Integer[]
实际上与String[]
(或Integer[][]
)不同,但ArrayList<String>
的类与ArrayList<Integer>
的类相同(和ArrayList<?>
以及ArrayList
和ArrayList<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>
。