【问题标题】:Ternary operator does not recognize compile error in Eclipse三元运算符无法识别 Eclipse 中的编译错误
【发布时间】:2018-08-21 06:54:41
【问题描述】:

我使用 Eclipse 作为 IDE,并有以下代码

List<Long> countList = new ArrayList<>();
Long count = (countList != null && !countList.isEmpty()) ? countList.get(0) : 0;

在 Eclipse 中,else 的自动装箱应该会产生编译错误,但事实并非如此。我也尝试过最新的 eclipse 版本 Photon,它仍然是一样的。

但是当我使用 Jenkins 构建项目时,它会抛出正确的编译错误。有人可以建议,如何解决这个问题?

我尝试了设置Preferences -&gt; Errors/Warnings -&gt; Boxing and unboxing conversions 并将默认行为从警告变为错误。但这也会导致其他不必要的错误。

有没有办法通过 eclipse 设置来解决这个问题?

【问题讨论】:

  • 为什么这是编译器错误? javac 是否有错误消息?
  • 什么样的“不必要的错误”?你在这里留下了很多的细节。
  • 对于 else 语句,您不能将整数 0 分配给 Long。它必须是 0L。在 InteliJ 和 javac 中,这是一个编译错误。

标签: java eclipse language-lawyer conditional-operator autoboxing


【解决方案1】:

这不是 Eclipse 中的错误,而是javac 中的错误。它只影响 Java 8,因此使用不同的版本可以解决问题。

请注意,虽然规范不允许像 Long var = 0; 这样的构造,但条件表达式是一个完全不同的字段。

Java 语言规范的section about the “Conditional Operator ? : 有一个数值条件表达式 的概念,甚至明确包含conversion table,表明Long 类型的第二个参数和类型的第三个参数的组合int 应该是有效的,结果类型为“bnp(Long,int)”,而“bnp”代表“Binary Numeric Promotion”¹

¹ 我特意链接到规范的 Java 8 版本,这是 javac 表现出这种错误行为的版本。

简而言之,它意味着在需要时取消装箱,然后在需要时扩大基元转换,最后,如果需要,结果将再次装箱。

请注意,即使 Java 8 的 javac 也能正确执行此操作,只要不涉及泛型方法:

Long boxed = !countList.isEmpty()? countList.get(0): null;
Long count = boxed != null? boxed: 0;// promotes int to Long

不会产生编译器错误。

涉及泛型方法时产生编译器错误的行为已在JDK-8162708 Unexpected syntax error with ternary operator and generics methods 中进行了描述。它还提到javac确实在Java 7和Java 9下正确处理了这个结构,所以问题只出现在Java 8中。我也刚刚验证了编译器错误在Java 11和Java 12的当前状态下没有出现.

值得指出的是,上述规则可能具有违反直觉的行为。例如

boolean someCondition = true;
Long variable = null;
Long other = someCondition? variable: 0;

将抛出一个NullPointerException,因为存储在variable 中的引用不会被传递,而是会被拆箱并再次装箱。

同样,

Integer variable = 42;
Long other = variable;

不是一个有效的分配,但是

Integer variable = 42;
Long other = true? variable: 0L;

是。

【讨论】:

  • 这太疯狂了,你之前已经向我展示了最后一个示例,我发誓现在看到它就像第一次看到它,这对于这么多错误来说太微妙了
猜你喜欢
  • 2017-05-12
  • 2015-09-21
  • 2019-01-09
  • 1970-01-01
  • 2012-12-18
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
相关资源
最近更新 更多