【发布时间】:2012-03-10 11:54:57
【问题描述】:
如果是这样,两者有什么区别? java库中实际上有两个单独的类定义吗?一个用于旧的 ArrayList 和一个用于新的通用的?这纯粹是出于好奇。
【问题讨论】:
-
泛型不会创建新类。它确保了编译器对编码的时间限制。 docs.oracle.com/javase/tutorial/java/generics/index.html
如果是这样,两者有什么区别? java库中实际上有两个单独的类定义吗?一个用于旧的 ArrayList 和一个用于新的通用的?这纯粹是出于好奇。
【问题讨论】:
不,它们是同一个类,因为只有一个类文件。现有 API 类以这样一种方式“生成”,即旧代码可以继续编译而无需更改,并与使用新功能的新代码很好地互操作。
【讨论】:
ArrayList,你根本就没有泛型,它是一个广泛的集合,可以存储对你想要的任何对象的引用。具有约束条件,您必须在检索它们时将它们转换为正确的类型。
ArrayList<Object> 和ArrayList 是不同的类型,具有不同的特性。后者称为“原始类型”,您可以在原始类型和泛型类型之间进行分配;事实上,您甚至可以在没有警告的情况下将泛型类型分配给原始类型。阅读 Angelika Langer 的精彩 Java 泛型常见问题解答,了解有关这一点和其他微妙点的信息:angelikalanger.com/GenericsFAQ。
只有一个类ArrayList,但它支持泛型,这意味着您可以使用类型对其进行注解。但是,这是可选的(主要是为了向后兼容),因此您也可以继续使用原始类型(但不鼓励这样做)。
请注意,Java 泛型只发生在编译器中,在运行时 ArrayList 实例本身不知道您分配给它的泛型类型。这意味着无论您是否对其进行注释,它在内部的工作方式完全相同。
与数组不同,泛型集合没有新的单独类。所以虽然Integer[] 与String[](或Integer[][])实际上有一个不同的类,但ArrayList<String> 的类与ArrayList<Integer> 相同(以及ArrayList<?> 和ArrayList 和@ 987654329@)。
而且与数组不同的是,泛型中并没有什么特别之处可供集合使用(尽管这仍然是它们最流行的应用程序)。相同的机制可用于完全不同的事物,例如 Callable。
【讨论】:
它们是同一个类,实际上区别仅在于类型检查器。
ArrayList<T> 只是编译器的一个注解,用于强制只有 T 类型的对象可以添加到特定列表中,因此它自动允许您从集合中检索已经属于 @987654323 类型的对象@。
这种称为参数多态性的机制已从 Java 版本 5 开始添加,并通过类型擦除实现:编译器将确保您使用仅具有正确类型的类,正如您定义的那样,但在运行时将使用旧的 ArrayList。
确实,它们是同一类。
【讨论】:
它们是一样的。泛型类型限制在编译时强制执行,但在运行时实际上不存在类型信息。这称为类型擦除,这意味着在运行时,实际上不可能确定一个实例是用什么泛型类型声明的。请参阅this Wikipedia page 了解更多信息。
【讨论】:
ArrayList<Object> a1 = new ArrayList<Object>();
ArrayList a2 = new ArrayList();
boolean same = a1.getClass().equals(a2.getClass());
System.out.println("same="+same);
这会打印“真”。这两个数组实际上是同一个类的对象。
【讨论】:
== 也将打印为 true。
ArrayList:已过时(未参数化)。 仅用于向后兼容。生成警告。
ArrayList<Object>:基于数组的对象列表。
ArrayList<? extends Object>:基于数组的列表某种类型的Object。
例如,可能指的是ArrayList<Integer>、ArrayList<String>,或者只是简单的ArrayList<Object>。
【讨论】: