[英]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.