我知道当 Java 编译器编译泛型类型时,它会执行类型擦除并从代码中删除对泛型的所有引用,而我的ArrayList<Cheesecake>
只是一个ArrayList
.
我没有明确答案的问题是,缺少类型(因此是强制类型转换)是否会导致速度变慢。换句话说,如果我使用标准 Java 编译器和 Oracle 的标准 JVM 1.7:
- 字节码是否包含类型转换?
- 如果是,它是否包括运行时检查以检查其类型是否正确?
- 转换本身是否需要大量时间?
- 让我自己的
CheesecakeList
类看起来与 相同ArrayList
,只是将所有的Object
s 都变成Cheesecake
s 我会获得任何东西(再次只是一个假设,我对拥有更大的二进制文件的任何副作用不感兴趣,因为更多的类或重复我的代码)。
我对类型擦除导致的任何其他问题不感兴趣,只是一个比我更了解 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 件事之一。如果您正在阅读本文是因为您确实遇到了性能问题,请帮自己一个忙,并启动一个分析器并找出瓶颈在哪里。如果你真的相信它的类型转换,那么你才应该尝试以某种方式优化它。