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

时间:2016-04-27 15:38:03

标签: 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.
    }
}

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

1 个答案:

答案 0 :(得分:8)

来自protected的{​​{1}}方法在界面中的Object方法中不可用,这并非巧合。

Section 9.2 of the JLS州:

  

如果接口没有直接的超接口,则接口隐式声明default成员方法public abstract,其中包含签名m,返回类型s和throws子句{{ 1}}对应于r中声明为t的每个public实例方法m,返回类型s和throws子句r,除非接口显式声明具有相同签名,相同返回类型和兼容t子句的Object方法。

接口不会继承abstract中的任何内容,但会隐式声明所有throws Object方法。这不包括任何public方法。这解释了为什么无法调用Objectprotected;它们不在界面中声明。