Java继承层次结构——实现接口的超类正在实现

3
当我在类B中扩展(继承)一个类A时,我正在实现所有类A实现的接口。
以下是...
interface INTF { ... }

class A implements INTF { ... }

class B extends A { .... }

"B类是A类的子类,正在实现INTF接口。那么,将B类声明为什么会有所收益呢?"
class B extends A implements INTF { .... }

这是一个HTML代码片段,其中包含以下内容:
//===========================
编辑:
Java API正在执行此操作。例如:
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> { ...

什么事?谢谢您。
4个回答

2

如果您的子类重新声明实现接口,那么没有区别。但是在反射API方面有很大的收益。我亲自遇到过这种情况。

当您调用B.class.getInterfaces()时,它返回一个Class[],其中仅包含由该类显式声明的接口,而不包括其超类,尽管实际上它实现了其超类实现的接口。 要解决此问题,您需要递归调用父类并获取所有已实现的接口。在子类中显式声明接口将有助于解决此问题。


1
Apache Commons-Lang 提供了一个很好的辅助方法 ClassUtils.getAllInterfaces() - dnault

2
你不必重新声明接口。然而,如果你使用Java反射,会有一些差别 - B.class.getInterfaces()。
  • 如果你不重新声明接口,则 B.class.getInterfaces() - 返回零个接口

  • 如果您重新声明接口,则 B.class.getInterfaces() - 返回一个接口

因此,是否重新声明接口取决于您如何在Java反射中使用它。对于大多数情况,我们不会重新声明它。

1

您不需要再次指定接口。您可以再次指定所有已实现的方法,但也不必这样做。

如果 A 在将来更改其实现的接口,则 B 可能不需要知道。


@user3880721 没有特别好的理由。有人曾经添加过它,他们不会删除一旦添加了某些东西,因为担心破坏向后兼容性。 - Peter Lawrey
它在早期版本中是否曾经相关?如果A正在实现INTF,则它正在全部实现 - A的任何后代都将覆盖A的内容。Java有没有其他情况? - user3880721
@user3880721 不是的,但最佳实践会随着时间而变化。当它被添加时,作者可能并没有意识到不重复是更好的做法。 - Peter Lawrey

0

无论您是否指定B实现INTF,都没有区别,因为它必须实现它,因为A正在实现它。

我不确定Java API为什么要这样做。我认为他们只是想让LinkedHashMap的用户更清楚地知道它实现了Map(否则用户将不得不查看HashMap的声明才能找到这一点)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接