对Object.clone()的function引用无法编译

编译

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()编译好……

这是一个错误吗?

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

JLS对此并不十分清楚; 例如,在受保护的访问部分,没有提到super.protectedMember 保护的super.protectedMember表格; 但很明显,这种forms应该在JLS中讨论; 它应该是可访问的。 (该部分的确表明X::mXm应该被视为相同的wrt访问权限)

在方法参考部分,措词也含糊不清; 尽管如此, super::clone应该可以像访问super.clone()访问。

已创建错误报告: JDK-8139836:“当x受保护时,不能使用super :: x方法引用” 。 它的当前状态是它将在Java 9中修复。