基本上,泛型是通过编译技巧在Java中实现的.编译后的泛型代码actually只使用java.lang.Object
,不管你在哪里谈论T
(或其他类型参数)——并且有一些元数据告诉编译器它确实是泛型类型.
当您针对泛型类型或方法编译一些代码时,编译器会计算出您真正的意思(即T
的类型参数是什么),并在compile时验证您所做的事情是否正确,但发出的代码再次只是根据java.lang.Object
进行对话——必要时,编译器会生成额外的强制转换.在执行时,a List<String>
和a List<Date>
完全相同;额外的类型信息已被编译器删除.
比方说,与C#相比,在C#中,信息在执行时被保留,允许代码包含typeof(T)
等等价于T.class
的表达式-除非后者是无效的.(请注意,.NET泛型和Java泛型之间还有进一步的区别.)在处理Java泛型时,类型擦除是许多"奇怪的"警告/错误消息的来源.
其他资源: