对Object.clone()的功能引用没有编译

时间:2015-10-13 16:06:02

标签: java lambda compiler-errors java-8

Compiling

import java.util.concurrent.Callable;

class Ideone
{
    Callable<?> x = super::clone;
}

使用Oracle JDK提供:

Main.java:6: error: incompatible types: invalid method reference
    Callable<?> x = super::clone;
                    ^
    clone() has protected access in Object

这没有意义,因为类应该能够访问其父级的受保护方法。这个表达式在Eclipse的编译器中运行良好。

此外,() -> super.clone()编译得很好......

这是一个错误吗?

1 个答案:

答案 0 :(得分:6)

super实际上不是一个表达式,并且没有静态类型可供讨论。 super.foo()this.foo()具有相同的访问权限;就是这样,方法调用在字节代码中的翻译方式不同,如“super invoke”,而不是“普通调用”。

JLS对此并不十分清楚;例如在protected access部分中,未提及super.protectedMember表单;但很明显,这种形式应该在JLS中讨论;它应该是可访问的。 (该部分确实建议X::mX.m应该被视为相同的w.r.t.访问权限)

method reference部分,措辞也含糊不清;尽管如此,super::clone的访问方式应与super.clone()可访问的方式相同。

已创建错误报告:JDK-8139836: “Can't use super::x method reference when x is protected”。它的当前状态是它将在Java 9中修复。