Java 为什么在Optional.map(字节[]:::克隆)上出现编译错误?

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

我在这里肯定找不到适合我的问题的答案。 情境:在工作中,我检查了一个现有的Java8项目。我使用EclipseNeon(4.6.0)

类具有以下字段:

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]);

它工作正常。

我在这里提交了一份错误报告:谢谢你的错误报告。现有的对数组克隆方法的支持无法按预期用于方法引用。这个问题已经解决了。