为什么某些对象方法不能从默认方法调用?
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
方法中不可用并非巧合。
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
方法。这就解释了为什么 clone
和 finalize
不能被调用;它们未在接口中声明。
在 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
方法中不可用并非巧合。
If an interface has no direct superinterfaces, then the interface implicitly declares a
public abstract
member methodm
with signatures
, return typer
, and throws clauset
corresponding to eachpublic
instance methodm
with signatures
, return typer
, and throws clauset
declared inObject
, unless anabstract
method with the same signature, same return type, and a compatiblethrows
clause is explicitly declared by the interface.
接口不会从 Object
继承任何东西,但它会隐式声明所有 public
Object
方法。这不包括任何 protected
方法。这就解释了为什么 clone
和 finalize
不能被调用;它们未在接口中声明。