【问题标题】:Why do I get a compile error on Optional.map(byte[]::clone)?为什么我在 Optional.map(byte[]::clone) 上出现编译错误?
【发布时间】:2016-07-22 14:14:40
【问题描述】:

我在 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 中的一个错误)。

【问题讨论】:

    标签: java eclipse java-8 bytearray optional


    【解决方案1】:

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

    数组类型的成员都有以下几种:

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

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

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

    【讨论】:

    【解决方案2】:

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

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

    它工作正常。

    【讨论】:

      猜你喜欢
      • 2013-08-14
      • 2014-06-08
      • 2011-06-25
      • 1970-01-01
      • 2014-10-11
      • 2021-11-28
      • 2020-09-18
      • 2012-09-21
      • 1970-01-01
      相关资源
      最近更新 更多