Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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 三元运算符无法识别Eclipse中的编译错误_Java_Eclipse_Language Lawyer_Conditional Operator_Autoboxing - Fatal编程技术网

Java 三元运算符无法识别Eclipse中的编译错误

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

我使用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())?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来说太微妙了