3

以下代码

import java.util.*;
import java.io.*;

@SuppressWarnings("unchecked")
List<Serializable> list = (List<Serializable>) (List<?>)
  Collections.singletonList(new Object());

for (Object el : list) { // -> ClassCastException
  System.out.println(el);
}

是正确的 Java(即使代码是可疑的)。使用javacand java6 它抛出

Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast to java.io.Serializable

虽然它在使用javacjava7 时运行没有错误。

是语言更改、修复错误还是隐藏功能?

(注意:使用 Eclipse 编译的代码在检查的所有 Eclipse 版本上运行时都没有错误 - Helios 到 Kepler。)

4

1 回答 1

2

您通过将原始数据添加Object到集合中来污染堆(您必须进行演员阵容才能实现)。这在技术上并不违法,但它是一个错误。

当您从隐式迭代器中提取值时,Java 6 编译器似乎会立即进行强制转换,而 Java 7 编译器则不会。Serializable如果不需要,不强制转换会更有效(因为持有变量只是Object),但据我从 JLS 了解,这种行为是未定义的。尝试javap在您的两个.class文件上运行并查看该for循环周围的代码(可能就在invokeinterface调用之后Iterator.next())。

于 2013-08-28T11:12:55.103 回答