java三元运算符

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

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

产生以下编译器错误:

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

由于我不理解的原因,以下修复了该问题

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

我正在使用Java 1.4。

这是1.4中的一个错误 ,并已根据bugreport 5080917修复 。

评价这是一个错误。

xxxxx @ xxxxx 2004-07-30

丹尼尔或多或少得到了这个权利,但已经删除了他的答案(五票)。

来自2nd Ed JLS的相关引用(1.2-1.4)

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

其中一种类型需要可以转换为另一种类型,而ArrayListHashSet则不然,但是对于CollectionHashSet以及ArrayListCollection都是如此。

在第3版JLS(1.5+)

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

这是显而易见的事情,因为事实certificate更难以指定和实现(当其中一个表达式为void时,我无意中得到了javac的早期版本崩溃)。 IIRC,这是作为仿制药的一部分完成的工作。