有人可以解释为什么这段代码?
Collection c = (5 == 5) ? new ArrayList() : new HashSet();
产生以下编译器错误:
不兼容的条件操作数类型ArrayList和HashSet
由于我不明白的原因,以下修复了问题
Collection c = (5 == 5) ? (Collection) new ArrayList() : new HashSet();
我正在使用Java 1.4。
答案 0 :(得分:7)
这是1.4中的错误,并已根据bugreport 5080917修复。
评估这是一个错误。
xxxxx @ xxxxx 2004-07-30
答案 1 :(得分:3)
丹尼尔或多或少得到了这个权利,但已经删除了他的答案(五票)。
第二版Ed JLS(1.2-1.4)的相关引用
- 如果第二个和第三个操作数是 不同的参考类型,然后它 必须有可能转换其中之一 其他类型的类型(呼叫 后一种类型T)通过转让 转换(第5.2节);的类型 条件表达式是T.它是一个 如果两个类型都不是编译时错误 赋值与另一个兼容 类型。
其中一种类型需要转换为另一种类型,ArrayList
和HashSet
不适用,但Collection
和HashSet
以及{{ 1}}和ArrayList
。
在第3版JLS(1.5 +)
中
- 否则,第二和第三 操作数是S1和S2类型 分别。设T1是那种类型 应用拳击的结果 转换为S1,让T2成为 应用产生的类型 拳击转换为S2。的类型 条件表达式是 应用捕获转换的结果 (§5.1.10)到lub(T1,T2) (§15.12.2.7)。
这是显而易见的事情,因为事实证明更难以指定和实现(当其中一个表达式为Collection
时,我无意中得到了javac的早期版本崩溃)。 IIRC,这是作为仿制药的一部分完成的工作。