Raf*_*ian 7 java java-8 default-method
在Java 8中创建默认方法时,某些Object方法无法在默认方法中调用.例如:
interface I {
default void m() {
this.toString(); // works.
this.clone(); // compile-time error, "The method clone() is undefined for the type I"
this.finalize(); // same error as above.
}
}
Run Code Online (Sandbox Code Playgroud)
似乎clone()并且finalize()是唯一的方法Object是不允许的.巧合的是,这些是Object受保护的唯一方法,但这个问题特别关注默认方法,因为它们将由扩展的类继承java.lang.Object.这是什么原因?
这不是一个巧合,protected从方法Object不可用的default在接口方法.
JLS第9.2节规定:
如果接口没有直接超接口,则接口隐式地声明
public abstract构件方法m与签名s,返回类型r,并抛出子句t对应于每个public实例方法m与签名s,返回类型r,和throws子句t宣布Object,除非abstract具有相同签名的方法,相同的返回类型,throws接口显式声明兼容子句.
接口不会从中继承任何内容Object,但它会隐式声明所有public Object方法.这不包括任何protected方法.这解释了为什么clone和finalize不能被称为; 它们未在界面中声明.