1

Java 的泛型会在源代码编译后删除类型信息。而且我想“擦除”是必要的,因为无论泛型类型是什么,java 只保留一个类的副本。So List<String>orList<Number>只是一个列表。那么我想知道是否有可能在只保留某个类的一个副本的前提下,该类的实例在创建时存储了泛型类型信息。

例如:当我们写:

List<String> list = new List<String>. 

编译器创建一个List对象以及与List相关的String的Class Object(即Object String.class),以便通用对象列表可以在运行时使用Class Object检查类型信息。是否可行或可行?

4

3 回答 3

4

我不完全确定您具体要问什么,但 Java 必须对泛型使用擦除的主要原因是向后兼容性。如果行为

List list = new ArrayList(); //You can't do new list(), it's an interface

...在版本之间进行了更改,当您从 Java 1.4 升级到 Java 5 时,您会遇到各种奇怪的事情,这可能会导致代码与以前的行为方式不同的错误。如果发生这种情况,那绝对是一件坏事!

如果他们不必保持向后兼容性,那么是的,他们可以做他们喜欢做的事——我们可以有很好的具体化泛型,并做一大堆我们现在不能做的其他事情。有一个提案(我认为是 Gafter 提出的)允许以向后兼容的方式在 Java 中实现泛型,但它会涉及创建所有应该是泛型的类的新版本。这会导致 API 混乱,因此(无论好坏)他们选择不走那条路。

于 2011-08-06T10:55:08.193 回答
3

我们List<String> l = new ArrayList<String>();从 java 5 开始使用。以前不是这样的。

就像List l = new ArrayList();用户可以在其中添加任何东西,比如整数、字符串或任何用户类型的对象。所以 Java 人不想更改旧代码。所以他们只是把它留给编译器,编译器可以在编译时检查这一点。

于 2011-08-06T11:03:17.493 回答
1

以保持与 Java5 之前的代码的二进制向后兼容性。

于 2011-08-06T10:54:20.883 回答