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

bil*_*.cn 18 java lambda compiler-errors java-8

编译

import java.util.concurrent.Callable;

class Ideone
{
    Callable<?> x = super::clone;
}
Run Code Online (Sandbox Code Playgroud)

使用Oracle JDK提供:

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

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

() -> super.clone()编译好......

这是一个错误吗?

Zho*_*gYu 7

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

JLS对此并不十分清楚; 例如在部分受保护的接入时,super.protectedMember没有提及形式; 但很明显,这种形式应该在JLS中讨论; 它应该是可访问的.(该部分确实建议X::m并且X.m应该对待相同的wrt访问权限)

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

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