7

在 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.
    }
}

似乎clone()并且finalize()是唯一Object不允许的方法。巧合的是,这些是唯一Object受保护的方法,但这个问题特别与默认方法有关,因为它们将被扩展的类继承java.lang.Object。这是什么原因?

4

1 回答 1

8

protected接口中的方法中的方法Object不可用并非巧合default

JLS 第 9.2 节规定:

如果接口没有直接的超接口,则该接口隐式声明一个public abstract成员方法m,其签名s、返回类型r和 throws 子句t对应于每个public实例方法,其中声明m了签名s、返回类型r和 throws 子句,除非方法具有相同的签名,相同的返回类型,并且接口显式声明了兼容子句。tObjectabstractthrows

接口不会从 继承任何东西Object,但会隐式声明所有public Object方法。这不包括任何protected方法。这就解释了为什么clone不能finalize调用;它们没有在接口中声明。

于 2016-04-27T15:45:03.167 回答