为什么某些Object方法无法从默认方法调用?

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.这是什么原因?

rge*_*man 8

这不是一个巧合,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方法.这解释了为什么clonefinalize不能被称为; 它们未在界面中声明.

  • @RaffiKhatchadourian只是为了澄清,接口**从不**继承自`Object`,无论是否有默认方法.他们根本就没有.继承自`Object`的问题是,例如`toString()`方法可以被任何实现`I`的类覆盖,那么应该选择哪个实现呢?接口继承的那个或实现接口的类中的接口? (2认同)