Java 泛型中删除的概念是什么?
最佳答案
这基本上是通过编译器技巧在 Java 中实现泛型的方式。编译后的通用代码实际上只是使用了java.lang.Object
无论您说什么T
(或其他一些类型参数)——并且有一些元数据告诉编译器它确实是一个泛型类型。
当您针对泛型类型或方法编译一些代码时,编译器会计算出您的真正含义(即 T
的类型参数是什么)并在编译时验证您重新做正确的事,但发出的代码再次只是以 java.lang.Object
的形式说话- 编译器在必要时生成额外的强制转换。在执行时,List<String>
和 List<Date>
完全一样;额外的类型信息已被编译器删除。
将其与 C# 进行比较,C# 中的信息在执行时保留,允许代码包含诸如 typeof(T)
之类的表达式。相当于T.class
- 除了后者是无效的。 (请注意,.NET 泛型和 Java 泛型之间还有进一步的区别。)在处理 Java 泛型时,类型删除是许多“奇怪”警告/错误消息的来源。
其他资源:
- Oracle documentation
- Wikipedia
- Gilad Bracha's Java generics guide (PDF - 强烈推荐;链接可能需要定期更改)
- Angelika Langer's Java Generics FAQ
关于java - Java泛型中删除的概念是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/313584/