我正在阅读关于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);
如果是这样,为什么?我认为类型为
ArrayList<SomeClass>
的事实可以在编译时和运行时保证只有SomeClass会存储在ArrayList中。或者您是否可以进行不安全的类型转换以将ArrayList<OtherClass>
转换成 ArrayList<SomeClass>
?还有其他Java泛型在运行时进行类型转换的情况吗?
最后,如果确实在运行时进行类型转换,是否存在JIT可以省略执行时类型转换检查的情况?
(请勿回答/评论微小的优化不值得做,预防性优化是万恶之源等类似问题。我看到这些问题在其他类似的问题上。这些观点已经被充分理解,但它们并不影响理解如何在幕后实现类型擦除的重点。)
ArrayList<String>
转换为ArrayList<Integer>
),那么你可以优化运行时检查,但这是另一个问题的话题。我选择Richante的答案作为“正确”的答案,因为他付出了编译和反汇编的努力(谢谢!)。 - Max