我无法在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中的一个错误)。
答案 0 :(得分:4)
您应该将此报告为Eclipse中的错误,因为它使用标准javac
编译器和其他IDE进行编译。具体来说,看起来Eclipse在Array Members上的Java语言规范部分中缺少以下内容:
数组类型的成员是以下所有成员:
public
final
字段length
,其中包含数组的组件数。长度可以是正数或零。
public
方法clone
,它会覆盖类Object
中同名方法,并且不会抛出任何已检查的异常。数组类型T[]
的克隆方法的返回类型为T[]
。
请注意,clone
中byte[]
覆盖的返回类型实际上是byte[]
,而不是Object
。似乎Eclipse编译器将类型推断为Object
。
答案 1 :(得分:1)
这绝对是一个Eclipse bug。作为解决方法,您可以改为使用lambda表达式:
this.stream = Optional.ofNullable(stream)
.map(b -> b.clone())
.orElse(new byte[0]);
它正常工作。