Java 三元运算符无法识别Eclipse中的编译错误
我使用Eclipse作为IDE,并有以下代码Java 三元运算符无法识别Eclipse中的编译错误,java,eclipse,language-lawyer,conditional-operator,autoboxing,Java,Eclipse,Language Lawyer,Conditional Operator,Autoboxing,我使用Eclipse作为IDE,并有以下代码 List<Long> countList = new ArrayList<>(); Long count = (countList != null && !countList.isEmpty()) ? countList.get(0) : 0; List countList=new ArrayList(); 长计数=(countList!=null&&!countList.isEmpty())?countLi
List<Long> countList = new ArrayList<>();
Long count = (countList != null && !countList.isEmpty()) ? countList.get(0) : 0;
List countList=new ArrayList();
长计数=(countList!=null&&!countList.isEmpty())?countList.get(0):0;
在Eclipse中,else的自动装箱应该会产生编译错误,但事实并非如此。我也尝试过最新的eclipse版本,但仍然是一样的
但是当我使用Jenkins构建项目时,它抛出了正确的编译错误。有人能建议如何解决这个问题吗
我尝试了设置首选项->错误/警告->装箱和取消装箱转换
,并将默认行为从警告转换为错误。但这也会导致其他不必要的错误
有没有办法通过eclipse设置只修复这个问题?这不是eclipse中的错误,而是Java C中的错误。它只影响Java8,所以使用不同的版本可以解决这个问题 注意,像
Long var=0这样的构造规范不允许使用代码>,条件表达式是一个完全不同的字段
Java语言规范有一个数字条件表达式的概念,甚至明确地包含一个表示类型为Long
的第二个参数和类型为int
的第三个参数的组合应该是有效的,结果类型为“bnp(Long,int)
”,而“bnp”代表“⑨
我故意链接到规范的Java 8版本,这是javac
表现出这种错误行为的版本
简言之,如果需要,它意味着取消装箱,然后根据需要扩大原语转换,最后,如果需要,结果将再次装箱
请注意,即使是Java 8的javac
也能正确地做到这一点,只要不涉及泛型方法:
Long boxed = !countList.isEmpty()? countList.get(0): null;
Long count = boxed != null? boxed: 0;// promotes int to Long
不产生编译器错误
中描述了涉及泛型方法时产生编译器错误的行为。它还提到,javac
在Java7和Java9下确实正确地处理了这个构造,所以这个问题只发生在Java8中。我还刚刚验证了编译器错误在Java11和Java12的当前状态下没有出现
值得指出的是,上述规则可能有违反直觉的行为。例如
boolean someCondition = true;
Long variable = null;
Long other = someCondition? variable: 0;
将抛出一个NullPointerException
,因为存储在变量
中的引用未被传递,但将再次被解除绑定和装箱
同样地
Integer variable = 42;
Long other = variable;
不是有效的赋值,但
Integer variable = 42;
Long other = true? variable: 0L;
是。为什么这是编译器错误?是否有javac
的错误消息?什么类型的“不必要的错误”?您在此处留下了很多详细信息。对于else语句,您不能将整数0赋给Long。它必须是0升。在InteliJ和javac中,这是一个编译错误。这太疯狂了,你之前给我展示了最后一个示例,我发誓现在看到它就像第一次一样,这对这么多bug来说太微妙了