默认情况下接口是否扩展了Object?

如果您定义如下所示的界面

interface I1{ } 

您可以在任何代码部分中编写

 I1 i1; i1.equals(null); 

然后从equals方法到来的地方,接口是否也扩展了超类Object ?,如果那样,接口可以如何扩展类?

假设让接口扩展超类Object,那么如果你看到为什么像Set thave这样的集合接口定义了equals()和hashCode()方法? 所有类都扩展了Object类,因此如果在Object类中的接口中定义任何抽象方法,那么实现接口的人就不需要实现这些方法。 如下面的代码

 interface I1{ String toString(); } class A implements I1{ } 

这里的类A不需要实现方法toString(),因为它存在于Object类中。 那么在集合接口中定义那些方法的目的是什么,因为它们不能强制实现类来实现那些方法。

然后从equals方法到来的地方,接口是否也扩展了超类Object ?,如果那样,接口可以如何扩展类?

Java语言规范明确地处理了这个问题。

从9.2节 :

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

基本上,这是你可以使用equalshashCode等 – 因为指定Java语言的方式意味着接口的任何具体实现都是一个类,并且该类最终必须是Object的子类,所以成员肯定会出席。

换句话说,虽然接口本身不扩展Object ,但已知任何实现都会。

这里的类A不需要实现方法toString(),因为它存在于Object类中。 那么在集合接口中定义那些方法的目的是什么,因为它们不能强制实现类来实现那些方法。

通常这只是为了清楚起见,例如,根据在Object声明的成员来记录对实现的期望。

每个类都隐式扩展了Object ,因此inheritance了Object类的每个(非私有)方法。

每个实例都有一个类,因此具有Object的所有方法。

实例是否实现接口与此点完全无关。

Object是一个类,接口不能扩展类,所以“不” – 接口不会从任何类inheritance任何东西。