假设我有以下代码......
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
答案 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)
两种变体在语义上完全相同。出于风格原因,您可能更喜欢一个而不是另一个(例如,为了让它立即向类的读者清楚它实现A
和B
)。
答案 4 :(得分:1)
代码的行为(或编译)没有区别。
有些人更喜欢明确列出所有已实现的接口,即使它们是由另一个实现的接口强制执行的。这纯粹是个人/代码风格偏好的问题。
答案 5 :(得分:0)
两种方法都是平等的。您可以选择implements A, B
而不是implements B
来指定对象的完整类型列表,而不是有关A-B层次结构的知识
答案 6 :(得分:0)
在这种情况下,它没有区别。但从技术上讲,你可以有两个接口,这些接口与相同的方法声明不相关。此实现将为两个接口实现方法。