繁体   English   中英

为什么Java泛型必须擦除类型信息?

[英]why java generics have to erase the type information?

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

例如:当我们写:

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

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

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

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

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

如果他们不必保留向后兼容性,那么可以,他们可以按照自己喜欢的方式做-我们可以拥有很好的通用化泛型,还可以做很多其他我们现在不能做的事情。 有一个提议(我认为是Gafter提出的),该提议将允许Java中的通用泛型以向后兼容的方式出现,但这将涉及为所有本应泛型的类创建新版本。 那会造成API混乱,所以(不管是好是坏)他们选择不沿着那条路走。

我们正在使用List<String> l = new ArrayList<String>(); 来自Java5。以前不是这样。

就像List l = new ArrayList(); 并且用户也可以向其中添加任何内容,例如Integer,String或任何用户类型的Object。因此Java人们不想更改旧代码。因此,他们将其保留给编译器,以便在编译时进行检查。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM