java三元运算符
有人能解释一下为什么这个代码吗java三元运算符,java,ternary-operator,Java,Ternary Operator,有人能解释一下为什么这个代码吗 Collection c = (5 == 5) ? new ArrayList() : new HashSet(); 产生以下编译器错误: 不兼容的条件操作数类型ArrayList和HashSet 出于我不理解的原因,以下内容解决了这个问题 Collection c = (5 == 5) ? (Collection) new ArrayList() : new HashSet(); 我使用的是Java1.4。这是1.4中的一个错误,已根据需要修复 评估这是一个
Collection c = (5 == 5) ? new ArrayList() : new HashSet();
产生以下编译器错误:
不兼容的条件操作数类型ArrayList和HashSet
出于我不理解的原因,以下内容解决了这个问题
Collection c = (5 == 5) ? (Collection) new ArrayList() : new HashSet();
我使用的是Java1.4。这是1.4中的一个错误,已根据需要修复 评估这是一个bug xxxxx@xxxxx2004-07-30
丹尼尔或多或少是对的,但他删除了自己的答案(以5票优势) 第二版JLS的相关报价(1.2-1.4)
- 如果第二个和第三个操作数是 不同的引用类型,那么 必须能够转换其中一个 将类型转换为其他类型(调用 后一种类型(T)通过赋值 转换(§5.2);类型 条件表达式是T。它是一个 如果两种类型都不是,则编译时错误 与另一个相容的赋值 类型
ArrayList
和HashSet
,但适用于Collection
和HashSet
以及ArrayList
和Collection
第三版JLS(1.5+)
- 否则,第二个和第三个 操作数的类型为S1和S2 分别地设T1为 拳击比赛的结果 转换为S1,设T2为 通过应用生成的类型 装箱转换为S2。类型 条件表达式是 应用捕获转换的结果 (§5.1.10)至润滑油(T1、T2) (§15.12.2.7)
这做了一件显而易见的事情,事实证明这更难指定和实现(当其中一个表达式是
void
时,我无意中让早期版本的javac崩溃了)。IIRC,这是作为泛型的一部分完成的工作。请注意,第一个在Java 1.5及以上版本上编译得很好。在我运行Sun JDK版本1.6.0的机器上运行得很好,但值得一问——除了我之外,其他人似乎并不陌生。据我所知,c
将始终计算为new ArrayList()
。有人能解释为什么做Collection c=(5==5)可能有用吗?新建ArrayList():新建HashSet()代码>而不是简单地执行集合c=new ArrayList()
考虑到(5==5)
的计算结果总是true
?@SultanBaby没有实际的理由让您编写这样的代码+1,您是对的。我误读了规范,现在删除了我的答案。这是1.5(老虎)中的一个错误,在1.6(野马)中修复了。这看起来像是第1.5/3版JLS中引入的规则的一个具体实例。@Daniel我想你的答案差不多了。@Tom/@Daniel:我想两个答案都是正确的。新的规则是为1.5引入的,但是有一些bug。然而,丹尼尔在复制粘贴一些JLS引文(我只是在发布我的答案后才看到)之前,已经在第1段中获得了5票赞成票,但没有指出1.4/1.5的差异。总是有很多错误。所引用的bug与此无关。