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()
编译得很好......
这是一个错误吗?
答案 0 :(得分:6)
super
实际上不是一个表达式,并且没有静态类型可供讨论。 super.foo()
与this.foo()
具有相同的访问权限;就是这样,方法调用在字节代码中的翻译方式不同,如“super invoke”,而不是“普通调用”。
JLS对此并不十分清楚;例如在protected access部分中,未提及super.protectedMember
表单;但很明显,这种形式应该在JLS中讨论;它应该是可访问的。 (该部分确实建议X::m
和X.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中修复。