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

标签 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 中唯一 protected 方法,但这个问题特别针对默认方法,因为它们将由扩展 java.lang.Object< 的类继承。这是什么原因?

最佳答案

Object 中的 protected 方法在接口(interface)的 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.

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

关于java - 为什么某些对象方法不能从默认方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36894508/

相关文章:

java - Docker + Java + OpenCV,java.library.path中没有opencv_java342

java - 为什么我不能将 lambda 分配给未类型化的谓词引用?但是可以为它分配一个初始化的类型谓词引用吗?

java - 任何具有单一方法的接口(interface)都可以被视为功能接口(interface)吗?

java - 继承、组合和默认方法

java - 抽象父类(super class)的默认接口(interface)方法

Java 默认方法 - 获取子类的类型

java - Spring 4,REST 服务从 Tomcat 返回 415 错误

java - 连接Mysql和eclipse

java - 将 java.sql.Timestamp 转换为 javax.xml.datatype.XMLGregorianCalendar 而不会丢失 nanos

java - Stream.toArray() 是线程安全的可变归约吗?