Java-是ArrayList和ArrayList<;对象>;两个不同的班级?

Java-是ArrayList和ArrayList<;对象>;两个不同的班级?,java,generics,arraylist,Java,Generics,Arraylist,如果是,两者的区别是什么?java库中实际上有两个独立的类定义吗?一个用于旧的ArrayList,一个用于新的通用列表?这纯粹是出于好奇。不,它们是同一个类,因为只有一个类文件。现有的API类以这样一种方式“泛型化”,即旧代码可以继续编译而不做任何更改,并且可以与使用新功能的新代码进行良好的互操作。只有一个类ArrayList,但它支持泛型,这意味着可以使用类型对其进行注释。但是,这是可选的(主要是为了向后兼容),因此您也可以继续使用原始类型(但不鼓励这样做) 请注意,Java泛型只发生在编译器

如果是,两者的区别是什么?java库中实际上有两个独立的类定义吗?一个用于旧的ArrayList,一个用于新的通用列表?这纯粹是出于好奇。

不,它们是同一个类,因为只有一个类文件。现有的API类以这样一种方式“泛型化”,即旧代码可以继续编译而不做任何更改,并且可以与使用新功能的新代码进行良好的互操作。

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

请注意,Java泛型只发生在编译器上,在运行时ArrayList实例本身不知道您为它指定了什么泛型类型。这意味着,无论您是否注释它,它在内部的工作方式完全相同

与数组不同,泛型集合没有新的独立类。因此,
Integer[]
的类实际上与
String[]
(或
Integer[][]
)的类不同,
ArrayList
的类与
ArrayList
(和
ArrayList
ArrayList
)的类相同


而且与数组不同的是,集合使用的泛型没有什么特殊之处(尽管这仍然是它们最流行的应用程序)。相同的机制可以用于完全不同的事物,例如可调用的。

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

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

这种称为参数多态性的机制自第5版起就被添加到Java中,并通过类型擦除来实现:编译器将确保您仅使用您定义的正确类型的类,但在运行时将使用旧的
ArrayList


他们确实是同一类人。

他们是一样的。泛型类型限制在编译时强制执行,但在运行时实际上不存在类型信息。这称为类型擦除,这意味着在运行时,实际上不可能确定实例声明的泛型类型。有关更多信息,请参阅。

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

boolean same = a1.getClass().equals(a2.getClass());
System.out.println("same="+same);
ArrayList a2=新的ArrayList(); 布尔相同=a1.getClass().equals(a2.getClass()); System.out.println(“相同=”+相同);
这印的是“真的”。两个数组实际上是同一类的对象。

  • ArrayList
    :过时(未经amerized)仅用于向后兼容。生成警告

  • ArrayList
    :基于数组的对象列表


  • ArrayListGenerics不会创建新类。它确保了编译器对编码的时间限制。这是否意味着如果您创建一个ArrayList(没有泛型),它会自动将对象作为泛型类型传入?如果您使用普通的
    ArrayList
    ,您根本没有泛型,它是一个广泛的集合,可以存储您想要的任何对象的引用。有一个约束,当您检索它们时,必须将它们转换为正确的类型
    ArrayList
    ArrayList
    是具有不同特征的不同类型。后者称为“原始类型”,您可以在原始类型和泛型类型之间进行赋值;事实上,您可以将泛型类型分配给原始类型,而无需发出警告。阅读Angelika Langer令人敬畏的Java泛型常见问题解答,了解这一点和其他微妙之处:。每个人都提到泛型只是一个“编译时”问题。所以在运行时ArrayList和ArrayList之间并没有区别,但在编译时它们是不同的。考虑到这一点,ArrayList和ArrayList对于编译器是不同的,但是ArrayList和ArrayList是相同的。@AmirPashazadeh:“ArrayList和ArrayList是相同的”。不可以。例如,您不能向ArrayList添加任何内容。您可以将ArrayList分配给ArrayList变量,但不能分配给ArrayList变量。
    =
    也会打印为true。是的,因为它们编译到同一个类。