在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
的类继承。这是什么原因?
答案 0 :(得分:8)
来自protected
的{{1}}方法在界面中的Object
方法中不可用,这并非巧合。
如果接口没有直接的超接口,则接口隐式声明
default
成员方法public abstract
,其中包含签名m
,返回类型s
和throws子句{{ 1}}对应于r
中声明为t
的每个public
实例方法m
,返回类型s
和throws子句r
,除非接口显式声明具有相同签名,相同返回类型和兼容t
子句的Object
方法。
接口不会继承abstract
中的任何内容,但会隐式声明所有throws
Object
方法。这不包括任何public
方法。这解释了为什么无法调用Object
和protected
;它们不在界面中声明。