4

有人可以解释为什么这段代码吗?

Collection c = (5 == 5) ? new ArrayList() : new HashSet();

产生以下编译器错误:

不兼容的条件操作数类型 ArrayList 和 HashSet

由于我不明白的原因,以下解决了问题

Collection c = (5 == 5) ? (Collection) new ArrayList() : new HashSet();

我正在使用 Java 1.4。

4

2 回答 2

7

这是 1.4 中的错误,已根据错误报告 5080917进行了修复。

评估这是一个错误。

xxxxx@xxxxx 2004-07-30

于 2010-07-05T17:46:50.333 回答
3

丹尼尔或多或少地理解了这一点,但删除了他的答案(有五票赞成)。

来自第 2 版 JLS (1.2-1.4) 的相关引用

  • 如果第二个和第三个操作数是不同的引用类型,那么必须可以通过赋值转换(第 5.2 节)将其中一个类型转换为另一种类型(称为后一种类型 T);条件表达式的类型是 T。如果两种类型的赋值都与另一种类型不兼容,则会出现编译时错误。

其中一种类型需要可转换为另一种类型,这对于 and 不正确,ArrayListHashSet对于CollectionandHashSet和 andArrayList是正确的Collection

在第三版 JLS (1.5+)

  • 否则,第二个和第三个操作数分别是 S1 和 S2 类型。令 T1 为对 S1 应用装箱转换产生的类型,令 T2 为对 S2 应用装箱转换产生的类型。条件表达式的类型是将捕获转换 (§5.1.10) 应用于 lub(T1, T2) (§15.12.2.7) 的结果。

这是显而易见的事情,事实证明它更难以指定和实现(当其中一个表达式为 时,我无意中让早期版本的 javac 崩溃了void)。IIRC,这是作为泛型的一部分完成的工作。

于 2010-07-05T20:07:05.490 回答