【问题标题】:Java - Are ArrayList and ArrayList<Object> two different classes?Java - ArrayList 和 ArrayList<Object> 是两个不同的类吗?
【发布时间】:2012-03-10 11:54:57
【问题描述】:

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

【问题讨论】:

标签: java generics arraylist


【解决方案1】:

不,它们是同一个类,因为只有一个类文件。现有 API 类以这样一种方式“生成”,即旧代码可以继续编译而无需更改,并与使用新功能的新代码很好地互操作。

【讨论】:

  • 这是否意味着如果你创建一个 ArrayList(没有泛型),它会自动将 Object 作为泛型类型传入?
  • 如果你使用普通的ArrayList,你根本就没有泛型,它是一个广泛的集合,可以存储对你想要的任何对象的引用。具有约束条件,您必须在检索它们时将它们转换为正确的类型。
  • 否; ArrayList&lt;Object&gt;ArrayList 是不同的类型,具有不同的特性。后者称为“原始类型”,您可以在原始类型和泛型类型之间进行分配;事实上,您甚至可以在没有警告的情况下将泛型类型分配给原始类型。阅读 Angelika Langer 的精彩 Java 泛型常见问题解答,了解有关这一点和其他微妙点的信息:angelikalanger.com/GenericsFAQ
  • 每个人都提到泛型只是一个“编译时间”问题。所以在运行时 ArrayList 和 ArrayList 之间没有区别,但在编译时它们不同。考虑到这一点 ArrayList 和 ArrayList 对于编译器来说是不同的,但是 ArrayList> 和 ArrayList 是一样的。
  • @AmirPashazadeh:“ArrayList> 和 ArrayList 是一样的”。 没有。例如,您不能向 ArrayList> 添加任何内容。您可以将 ArrayList 分配给 ArrayList> 变量,但不能分配给 ArrayList 变量。
【解决方案2】:

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

请注意,Java 泛型只发生在编译器中,在运行时 ArrayList 实例本身不知道您分配给它的泛型类型。这意味着无论您是否对其进行注释,它在内部的工作方式完全相同。

与数组不同,泛型集合没有新的单独类。所以虽然Integer[]String[](或Integer[][])实际上有一个不同的类,但ArrayList&lt;String&gt; 的类与ArrayList&lt;Integer&gt; 相同(以及ArrayList&lt;?&gt;ArrayList 和@ 987654329@)。

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

【讨论】:

    【解决方案3】:

    它们是同一个类,实际上区别仅在于类型检查器。

    ArrayList&lt;T&gt; 只是编译器的一个注解,用于强制只有 T 类型的对象可以添加到特定列表中,因此它自动允许您从集合中检索已经属于 @987654323 类型的对象@。

    这种称为参数多态性的机制已从 Java 版本 5 开始添加,并通过类型擦除实现:编译器将确保您使用仅具有正确类型的类,正如您定义的那样,但在运行时将使用旧的 ArrayList

    确实,它们是同一类。

    【讨论】:

      【解决方案4】:

      它们是一样的。泛型类型限制在编译时强制执行,但在运行时实际上不存在类型信息。这称为类型擦除,这意味着在运行时,实际上不可能确定一个实例是用什么泛型类型声明的。请参阅this Wikipedia page 了解更多信息。

      【讨论】:

        【解决方案5】:
        ArrayList<Object> a1 = new ArrayList<Object>();
        ArrayList a2 = new ArrayList();
        
        boolean same = a1.getClass().equals(a2.getClass());
        System.out.println("same="+same);
        

        这会打印“真”。这两个数组实际上是同一个类的对象。

        【讨论】:

        • a == 也将打印为 true。
        • 是的,因为它们编译成同一个类。
        【解决方案6】:
        • ArrayList:已过时(未参数化)。 仅用于向后兼容。生成警告。

        • ArrayList&lt;Object&gt;:基于数组的对象列表。

        • ArrayList&lt;? extends Object&gt;:基于数组的列表某种类型的Object
          例如,可能指的是ArrayList&lt;Integer&gt;ArrayList&lt;String&gt;,或者只是简单的ArrayList&lt;Object&gt;

        【讨论】:

          猜你喜欢
          • 2018-05-16
          • 1970-01-01
          • 2018-12-17
          • 1970-01-01
          • 2015-06-29
          • 1970-01-01
          • 2014-11-28
          • 1970-01-01
          • 2014-12-25
          相关资源
          最近更新 更多