Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java三元运算符_Java_Ternary Operator - Fatal编程技术网

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与此无关。