有人可以解释为什么这段代码吗?
Collection c = (5 == 5) ? new ArrayList() : new HashSet();
产生以下编译器错误:
不兼容的条件操作数类型 ArrayList 和 HashSet
由于我不明白的原因,以下解决了问题
Collection c = (5 == 5) ? (Collection) new ArrayList() : new HashSet();
我正在使用 Java 1.4。
有人可以解释为什么这段代码吗?
Collection c = (5 == 5) ? new ArrayList() : new HashSet();
产生以下编译器错误:
不兼容的条件操作数类型 ArrayList 和 HashSet
由于我不明白的原因,以下解决了问题
Collection c = (5 == 5) ? (Collection) new ArrayList() : new HashSet();
我正在使用 Java 1.4。
这是 1.4 中的错误,已根据错误报告 5080917进行了修复。
评估这是一个错误。
xxxxx@xxxxx 2004-07-30
丹尼尔或多或少地理解了这一点,但删除了他的答案(有五票赞成)。
来自第 2 版 JLS (1.2-1.4) 的相关引用
- 如果第二个和第三个操作数是不同的引用类型,那么必须可以通过赋值转换(第 5.2 节)将其中一个类型转换为另一种类型(称为后一种类型 T);条件表达式的类型是 T。如果两种类型的赋值都与另一种类型不兼容,则会出现编译时错误。
其中一种类型需要可转换为另一种类型,这对于 and 不正确,ArrayList
但HashSet
对于Collection
andHashSet
和 andArrayList
是正确的Collection
。
在第三版 JLS (1.5+)
- 否则,第二个和第三个操作数分别是 S1 和 S2 类型。令 T1 为对 S1 应用装箱转换产生的类型,令 T2 为对 S2 应用装箱转换产生的类型。条件表达式的类型是将捕获转换 (§5.1.10) 应用于 lub(T1, T2) (§15.12.2.7) 的结果。
这是显而易见的事情,事实证明它更难以指定和实现(当其中一个表达式为 时,我无意中让早期版本的 javac 崩溃了void
)。IIRC,这是作为泛型的一部分完成的工作。