Java 为什么在Optional.map(字节[]:::克隆)上出现编译错误?
我在这里肯定找不到适合我的问题的答案。 情境:在工作中,我检查了一个现有的Java8项目。我使用EclipseNeon(4.6.0) 类具有以下字段:Java 为什么在Optional.map(字节[]:::克隆)上出现编译错误?,java,eclipse,java-8,bytearray,optional,Java,Eclipse,Java 8,Bytearray,Optional,我在这里肯定找不到适合我的问题的答案。 情境:在工作中,我检查了一个现有的Java8项目。我使用EclipseNeon(4.6.0) 类具有以下字段: private final byte[] stream; 类构造函数具有以下参数: byte[] stream 它是这样做的: this.stream = Optional.ofNullable(stream) .map(byte[]::clone) .orElse(ArrayUtils
private final byte[] stream;
类构造函数具有以下参数:
byte[] stream
它是这样做的:
this.stream = Optional.ofNullable(stream)
.map(byte[]::clone)
.orElse(ArrayUtils.EMPTY_BYTE_ARRAY);
不幸的是,表达式上有一个错误:类型不匹配:无法从对象转换为字节[]
,特别是当.map(字节[]:::克隆)
部分返回一个可选的(根据Eclipse)而不是可选的
因为我是唯一一个使用Eclipse的人——其他人使用IntelliJ,他们没有错误——我只能自己处理这个问题
我可以/应该做什么(除了像Eclipse建议的那样在表达式中的某个地方强制转换为byte[]
作为快速修复)
注意:我记得几年前在Java 1.5泛型中看到过类似的奇怪编译错误,但情况正好相反:我使用Eclipse时还可以,但我的另一位同事使用了Netbeans,他出现了编译错误(经过一些搜索后,他发现这是JDK中的一个错误).您应该在Eclipse中将此报告为一个bug,因为它使用标准的javac
编译器和其他IDE进行编译。具体来说,Eclipse在Java语言规范部分缺少以下内容:
数组类型的成员包括以下所有成员:
public
final
字段length
,其中包含阵列的组件数。长度可以是正或零
- 方法
public
方法clone
,它覆盖类对象中同名的方法
,并且不抛出任何已检查的异常。数组类型T[]
的克隆方法的返回类型为T[]
请注意,在字节[]
中重写的克隆的返回类型实际上是字节[]
,而不是对象
。Eclipse编译器似乎推断类型为对象
,这肯定是一个Eclipse错误。作为解决方法,您可以使用lambda表达式:
this.stream = Optional.ofNullable(stream)
.map(b -> b.clone())
.orElse(new byte[0]);
它工作正常。我在这里提交了一份错误报告:谢谢你的错误报告。现有的对数组克隆方法的支持无法按预期用于方法引用。这个问题已经解决了。