Java 对Object.clone()的函数引用不';不编译

Java 对Object.clone()的函数引用不';不编译,java,lambda,compiler-errors,java-8,Java,Lambda,Compiler Errors,Java 8,import java.util.concurrent.Callable; 表意文字 { 可调用x=super::clone; } 使用Oracle JDK可以提供: Main.java:6: error: incompatible types: invalid method reference Callable<?> x = super::clone; ^ clone() has protected access in Ob

import java.util.concurrent.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
Main.java:6:错误:不兼容的类型:无效的方法引用
可调用x=super::clone;
^
clone()在对象中具有受保护的访问权限
这毫无意义,因为类应该能够访问其父类的受保护方法。这个表达式在Eclipse的编译器中运行良好

而且,
()->super.clone()
编译得很好


这是一个bug吗?

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

JLS对此不是很清楚;e、 g.在第节中,未提及
super.protectedMember
表格;但显然,这种形式应该在JLS中讨论;而且它应该是可访问的。(本节确实建议应将
X::m
X.m
视为相同的w.r.t.访问权)

在本节中,措辞也含糊不清;然而,
super::clone
的访问方式应与
super.clone()
的访问方式相同


已创建错误报告:。它的当前状态是,它将在Java9中修复。

这个::clone是否有效?我可以用JDK1.8.0和EclipseMars4.5.0复制它。看起来像是一个Eclipse bug。在JDK1.8.0\u60和Eclipse中运行良好Mars@thecoop:
this.clone
或通常
this::protectedMethod
有效,而当声明类位于不同的包中时,任何
super::protectedMethod
都会失败。@billc.cn我阅读了6.6.2非常简单:只允许访问受保护的成员在子类的主体内。此外,这三个要点适用于其中指定的条件。这些要点是为了防止访问同级类中的受保护成员,而
super
不属于这些要点。因此,它属于介绍性语句,因此不受三个限制(请参见我的[评论](#comment54031785_33107500))的限制。6.6.2.1是用非常精确的语言编写的,因此我要说它在案例上并不含糊:案例实际上是未定义的。然而,由于实现一个有用的
克隆()
,需要这个表单,我很难相信它在规范中丢失了这么久。。。您是否认为非限定的
clone()
表单也未定义?也许大家都知道它相当于
this.clone()
。类似地,
super.clone()。但是说“
super.foo()
this.foo()
具有相同的访问权限并不完全正确,因为当前类可以用不同的(较少限制的)访问权限覆盖
foo()
。@Holger-我们不是在讨论
foo
的一般访问权限。我们讨论的是
this.foo()
是否可访问,这是一个是非问题。(总是肯定的)很明显,您想要的语句是正确的,因为
foo()
只有在可访问的情况下才能被重写。不过,“拥有相同的访问权限”是一个误导性的措辞。
Main.java:6: error: incompatible types: invalid method reference
    Callable<?> x = super::clone;
                    ^
    clone() has protected access in Object