Java 泛型的类型擦除是否会导致全类型强制转换?
我知道当Java编译器编译泛型类型时,它会执行类型擦除并从代码中删除对泛型的所有引用,而my只是一个.ArrayList<Cheesecake>
ArrayList
我没有明确答案的问题是,缺少类型(因此是强制性的类型转换)是否会导致速度变慢。换句话说,如果我使用Oracle的标准Java编译器和标准JVM 1.7:
- 字节码是否包含类型转换?
- 如果是,它是否包括运行时检查以检查它是否是正确的类型?
- 转换本身是否花费了不平凡的时间?
- 如果使我自己的类看起来与 相同,只是将所有的s都转换为s,我就会得到任何东西(再次只是一个假设,我对拥有更大的二进制文件的任何副作用不感兴趣,因为更多的类和我代码中的重复)。
CheesecakeList
ArrayList
Object
Cheesecake
我对类型擦除导致的任何其他问题不感兴趣,只是来自比我更了解JVM的人的简单答案。
我最感兴趣的是这个例子中的成本:
List<Cheesecake> list = new ArrayList<Cheesecake>();
for (int i = 0; i < list.size(); i++)
{
// I know this gets converted to ((Cheesecake)list.get(i)).at(me)
list.get(i).eat(me);
}
与以下情况相比,循环内的投射是否昂贵和/或重要:
CheesecakeList list = new CheesecakeList();
for (int i = 0; i < list.size(); i++)
{
//where the return of list.get() is a Cheesecake, therefore there is no casting.
list.get(i).eat(me);
}
免责声明:这主要是学术好奇心的问题。我真的怀疑类型转换是否存在任何重大的性能问题,如果我在代码中发现性能错误,那么消除对它们的需求甚至不会是我会做的前5件事之一。如果您正在阅读本文,因为您确实遇到了性能问题,请帮自己一个忙,并启动一个分析器并找出瓶颈的位置。如果你真的相信它的类型转换,那么只有这样你才应该尝试以某种方式优化它。