当'B'延伸'A'时,为什么要实现接口'A'和'B'

时间:2014-09-09 13:22:00

标签: 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(){};
} 

无论类ImplementTwo是实现B和A,还是只实现B,它仍然需要在接口A中实现方法a(),因为接口B扩展了接口A.是否有任何理由明确地执行

...implements B, A

而不仅仅是

...implements B  

7 个答案:

答案 0 :(得分:5)

两种方法在行为方面没有区别。就字节码信息而言,在涉及实现接口的信息方面存在细微差别。例如:

Class<?>[] interfaces = ImplementTwo.class.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
    System.out.println(interfaces[i]);
}
使用implements B, A时,

将返回两个类实例,而使用implements B时,它将返回一个实例。

但是,以下两种方法都会返回true

A.class.isAssignableFrom(ImplementTwo.class)

答案 1 :(得分:2)

IMO是您希望明确指定它的唯一原因是,如果您尝试使代码更容易被其他需要与之交互的人阅读。即使这样说,实际上,像这样的两步间接并不是那么抽象,以至于难以遵循,所以我并不认为这有必要发生。

答案 2 :(得分:2)

最着名的例子是使用界面Serializable

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

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

答案 3 :(得分:1)

两种变体在语义上完全相同。出于风格原因,您可能更喜欢一个而不是另一个(例如,为了让它立即向类的读者清楚它实现AB)。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

两种方法都是平等的。您可以选择implements A, B而不是implements B来指定对象的完整类型列表,而不是有关A-B层次结构的知识

答案 6 :(得分:0)

在这种情况下,它没有区别。但从技术上讲,你可以有两个接口,这些接口与相同的方法声明不相关。此实现将为两个接口实现方法。