为什么某些对象方法不能从默认方法调用?

Why are certain Object methods not callable from default methods?

在 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 的 类 继承。这是什么原因?

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

Section 9.2 of the JLS 状态:

If an interface has no direct superinterfaces, then the interface implicitly declares a public abstract member method m with signature s, return type r, and throws clause t corresponding to each public instance method m with signature s, return type r, and throws clause t declared in Object, unless an abstract method with the same signature, same return type, and a compatible throws clause is explicitly declared by the interface.

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