Java 为什么要实现接口';A';和';B';,何时';B';扩展';A';

Java 为什么要实现接口';A';和';B';,何时';B';扩展';A';,java,class,interface,Java,Class,Interface,假设我有以下代码 interface A{ void a(); } interface B extends A{ void b(); } class ImplementOne implements B{ public void a(){}; public void b(){}; } class ImplementTwo implements B, A{ public void a(){}; public void b(){}; } 不管类Imple

假设我有以下代码

interface A{
  void a();
}

interface B extends A{
  void b();
}

class ImplementOne implements B{ 
  public void a(){};
  public void b(){};
}     

class ImplementTwo implements B, A{ 
  public void a(){};
  public void b(){};
} 
不管类ImplementTwo是同时实现B和A,还是仅仅实现B,它仍然需要在接口A中实现方法A(),因为接口B扩展了接口A。有什么原因可以显式实现吗

...implements B, A
而不仅仅是

...implements B  

两个变体在语义上完全相同。出于风格上的原因,您可能更喜欢其中一个(例如,为了让类的读者立即清楚地知道它同时实现了
A
B
)。

代码的行为(或编译)没有区别


有些人喜欢显式列出所有实现的接口,即使它们是由另一个实现的接口强制执行的。这纯粹是个人/代码风格偏好的问题。

我认为,如果您试图让需要与代码交互的其他人更容易阅读代码,那么您希望明确指定它的唯一原因是。即使是这样说,像这样的两步间接法也不是那么抽象,很难理解,所以我真的不认为这有必要发生

两种方法是相同的。您可以选择
implements A,B
而不是
implements B
来指定对象的整个类型列表,而不了解A-B层次结构

最著名的示例是使用接口
可序列化

这通常是为了:如果超级接口突然从
Serializable
接口分离,它的子接口仍将保持
Serializable
,因为它已经定义为
Serializable


这通常发生在代码重构时。除此之外,没有区别。

这两种方法在行为上没有区别。在字节码信息方面,当涉及到关于实现接口的信息时,有一点不同。例如:

Class<?>[] interfaces = ImplementTwo.class.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
    System.out.println(interfaces[i]);
}

在这种情况下,这没什么区别。但从技术上讲,您可以有两个接口,它们彼此之间不相关,并且具有相同的方法声明。此实现将实现两个接口的方法。

除了代码样式之外,没有其他特殊原因。看看现有的Awners:@PieterSchool,这个问题并没有回答这个问题,OP并没有询问扩展与实现的区别,但是关于指定多个相互扩展的接口的风格差异。相关:重新实现一个接口是否会改变当多个默认值可用时将使用的默认实现?有趣的捕获和到目前为止唯一不无聊的答案,+1+1在JDK中发生这种情况的一个常见原因是它是在某一点上添加的,他们非常不愿意更改这样的内容,以防它破坏别人的代码。i、 e.有这么多的代码,很可能有人编写了依赖于此的代码,例如通过反射。我打赌,在过去,接口B没有扩展A,后来一些人意识到B应该扩展A。然后,他们修复了1或2个编译器错误,用于缺少“A”方法的实现,而不必费心修改已经声明为“实现A,B”的可能众多的类。
A.class.isAssignableFrom(ImplementTwo.class)