为什么我在Optional.map(byte [] :: clone)上遇到编译错误?

时间:2016-07-22 14:14:41

标签: java eclipse java-8 bytearray optional

我无法在SO上找到适合我的问题的答案。 情况:在工作中我检查了一个现有的Java8项目。我使用Eclipse Neon(4.6.0)

一个类有这个字段:

private final byte[] stream;

类构造函数具有以下参数:

byte[] stream

并且这样做:

    this.stream = Optional.ofNullable(stream)
            .map(byte[]::clone)
            .orElse(ArrayUtils.EMPTY_BYTE_ARRAY);

不幸的是,表达式上存在错误:Type mismatch: cannot convert from Object to byte[],尤其是.map(byte[]::clone)部分返回Optional<Object>(根据Eclipse)而不是Optional<byte[]>

由于我是唯一一个使用Eclipse的人 - 其他人使用IntelliJ并且他们没有错误 - 我自己留下了这个。

我可以/应该做什么(除了在表达式中某处作为byte[]进行转换,如Eclipse的快速修复所示)?

注意:我记得几年前在Java 1.5泛型中看到了类似的奇怪的编译错误,但反过来说:我可以使用Eclipse,但另一个我使用过的Netbeans,他遇到了编译错误(经过一些搜索,他发现这是JDK中的一个错误)。

2 个答案:

答案 0 :(得分:4)

您应该将此报告为Eclipse中的错误,因为它使用标准javac编译器和其他IDE进行编译。具体来说,看起来Eclipse在Array Members上的Java语言规范部分中缺少以下内容:

  

数组类型的成员是以下所有成员:

     
      
  • public final字段length,其中包含数组的组件数。长度可以是正数或零。

  •   
  • public方法clone,它会覆盖类Object中同名方法,并且不会抛出任何已检查的异常。数组类型T[]的克隆方法的返回类型为T[]

  •   

请注意,clonebyte[]覆盖的返回类型实际上是byte[],而不是Object。似乎Eclipse编译器将类型推断为Object

答案 1 :(得分:1)

这绝对是一个Eclipse bug。作为解决方法,您可以改为使用lambda表达式:

this.stream = Optional.ofNullable(stream)
        .map(b -> b.clone())
        .orElse(new byte[0]);

它正常工作。