当我扩展一个类,比如说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
答案 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
的声明才能找到它)。