java三元运算符

时间:2010-07-05 17:29:10

标签: java ternary-operator

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

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

产生以下编译器错误:

  

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

由于我不明白的原因,以下修复了问题

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

我正在使用Java 1.4。

2 个答案:

答案 0 :(得分:7)

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

  

评估这是一个错误。

     

xxxxx @ xxxxx 2004-07-30

答案 1 :(得分:3)

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

第二版Ed JLS(1.2-1.4)的相关引用

  
      
  • 如果第二个和第三个操作数是   不同的参考类型,然后它   必须有可能转换其中之一   其他类型的类型(呼叫   后一种类型T)通过转让   转换(第5.2节);的类型   条件表达式是T.它是一个   如果两个类型都不是编译时错误   赋值与另一个兼容   类型。
  •   

其中一种类型需要转换为另一种类型,ArrayListHashSet不适用,但CollectionHashSet以及{{ 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,这是作为仿制药的一部分完成的工作。