为什么java泛型必须删除类型信息?

为什么java泛型必须删除类型信息?,java,generics,erase,Java,Generics,Erase,Java的泛型将在编译源代码后删除类型信息。我想擦除是必要的,因为无论泛型类型是什么,java只保留类的一个副本。所以列表或列表只是一个列表。然后我想知道,在只保留某个类的一个副本的前提下,该类的实例是否可能在创建时存储泛型类型信息 例如: 当我们写作时: List<String> list = new List<String>. 编译器将创建一个List对象和一个String的Class对象,即与List关联的object String.Class,以便泛型对象列表

Java的泛型将在编译源代码后删除类型信息。我想擦除是必要的,因为无论泛型类型是什么,java只保留类的一个副本。所以列表或列表只是一个列表。然后我想知道,在只保留某个类的一个副本的前提下,该类的实例是否可能在创建时存储泛型类型信息

例如: 当我们写作时:

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

编译器将创建一个List对象和一个String的Class对象,即与List关联的object String.Class,以便泛型对象列表可以在运行时使用Class对象检查类型信息。它是可能的还是可行的?

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

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

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

List list = new ArrayList(); //You can't do new list(), it's an interface
…在不同版本之间进行了更改,当您从Java 1.4升级到Java 5时,可能会发生各种奇怪的事情,可能会导致代码行为与以前不同的bug。如果发生这种情况,那绝对是件坏事


如果他们不必保留向后兼容性,那么是的,他们可以做他们喜欢做的事情——我们可以有很好的具体化泛型,做一大堆我们现在做不到的事情。Gafter提出了一个建议,我认为这将允许以向后兼容的方式在Java中具体化泛型,但它将涉及创建所有本应为泛型的类的新版本。这会给API带来一大堆混乱,所以不管是好是坏,他们都选择不走这条路。

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

List list = new ArrayList(); //You can't do new list(), it's an interface
…在不同版本之间进行了更改,当您从Java 1.4升级到Java 5时,可能会发生各种奇怪的事情,可能会导致代码行为与以前不同的bug。如果发生这种情况,那绝对是件坏事

如果他们不必保留向后兼容性,那么是的,他们可以做他们喜欢做的事情——我们可以有很好的具体化泛型,做一大堆我们现在做不到的事情。Gafter提出了一个建议,我认为这将允许以向后兼容的方式在Java中具体化泛型,但它将涉及创建所有本应为泛型的类的新版本。这会给API带来一大堆混乱,所以不管是好是坏,他们选择不走这条路。

我们使用的是List l=new ArrayList;来自Java5。以前不是这样的

这就像列表l=新的ArrayList;用户也可以向其中添加任何内容,如整数、字符串或任何用户类型的对象。因此,Java用户不想更改旧代码。因此,他们只需将其保存到编译器,编译器可以在编译时对此进行检查。

我们使用的是List l=new ArrayList;来自Java5。以前不是这样的


这就像列表l=新的ArrayList;用户也可以向其中添加任何内容,如整数、字符串或任何用户类型的对象。因此,Java用户不想更改旧代码。因此,他们只需将其保存到编译器,编译器可以在编译时对此进行检查。

您的意思是我们使用的是List l=new ArrayList;是的,对不起,我错写了列表l=newArrayList;从java 5中,您的意思是我们正在使用列表l=新的ArrayList;是的,对不起,我错写了列表l=newArrayList;来自java 5非常感谢。你的回答绝对是我想知道的。非常好,非常感谢。你的回答绝对是我想知道的。非常有帮助。