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.如果两个类型的赋值都与另一个类型不兼容,则它是编译时错误。
其中一种类型需要可以转换为另一种类型,而ArrayList
和HashSet
则不然,但是对于Collection
和HashSet
以及ArrayList
和Collection
都是如此。
在第3版JLS(1.5+)
- 否则,第二和第三操作数分别是S1和S2类型。 设T1是将拳击转换应用到S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型。 条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)(第15.12.2.7节)的结果。
这是显而易见的事情,因为事实certificate更难以指定和实现(当其中一个表达式为void
时,我无意中得到了javac的早期版本崩溃)。 IIRC,这是作为仿制药的一部分完成的工作。