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

时间:2014-07-29 21:49:08

标签: java inheritance interface

当我扩展一个类,比如说B类中的A类时,我正在实现类A实现的所有接口。

以下,

interface INTF { ... }

class A implements INTF { ... }

class B extends A { .... }

作为A类后代的B类正在实施INTF。

那么,将B级声明为

,我的收获是什么
class B extends A implements INTF { .... }

// ===========================

编辑:

Java API正在这样做。例如:

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> { ...

为什么?

TIA

4 个答案:

答案 0 :(得分:2)

如果你的子类重申它实现了一个接口,那就没什么区别了。但是当涉及到Reflection API时,它有很大的好处。我亲自面对它..

当你调用B.class.getInterfaces()时,它返回一个Class [],它只包含那些由类显式声明的接口而不是它的超类,尽管实际上它正在实现由超类实现的接口。   要解决它,你需要递归调用超类并实现所有接口。在你的子类中显式地声明一个接口将在这种情况下帮助你

答案 1 :(得分:2)

您不必再次重新声明界面。但是,如果使用Java反射会有区别 - B.class.getInterfaces()

  • 如果您不再重新声明界面。 B.class.getInterfaces() - 返回零接口

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

因此决定再次重新声明界面或不依赖于您如何使用Java反射。在大多数情况下,我们不会再次重申它。

答案 2 :(得分:1)

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

如果A更改了它将来实现的界面,可能不需要了解它。

答案 3 :(得分:0)

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

我不确定为什么Java API会这样做。我假设他们只是想让LinkedHashMap的用户更清楚它实现Map(否则用户必须查看HashMap的声明才能找到它)。