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

2022-09-02 22:31:28

编译

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

super实际上不是一个表达式,也没有静态类型可以谈论。 具有 与 相同的访问权限 ;只是,方法调用在字节码中的翻译方式不同,作为“超级调用”,而不是“普通调用”。super.foo()this.foo()

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

方法参考部分,措辞也很模糊;但是,应该以与可访问相同的方式进行访问。super::clonesuper.clone()

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


答案 2

推荐