我正在阅读有关 C++ 模板和 C# 泛型的讨论,以及它们与 Java 的类型擦除泛型有何不同。我读过一个声明,说 Java 在运行时仍然使用强制转换,例如在处理集合时。如果这是真的,我不知道!
假设我有如下代码:
ArrayList<SomeClass> list = new ArrayList<SomeClass>();
...
SomeClass object = list.get(0);
我的问题是。这是否有效地编译为
ArrayList list = new ArrayList();
...
SomeClass object = (SomeClass) list.get(0);
如果是这样,为什么?我认为 list 是类型ArrayList<SomeClass>
保证的事实,在编译时和运行时,只有 SomeClass 将存储在 ArrayList 中?或者您是否可以进行不安全的类型转换以将 aArrayList<OtherClass>
转换为ArrayList<SomeClass>
?
在 Java 泛型中是否存在其他运行时类型转换的情况?
最后,如果确实使用了运行时强制转换,是否存在 JIT 可以忽略运行时强制转换检查的情况?
(请不要回答/评论微优化不值得,抢先优化是万恶之源等。我在其他类似问题上看到了这些。这些点很好理解,但它们并没有带走尝试的意义了解类型擦除的泛型是如何在底层实现的。)