实现一个接口并扩展实现了相同接口的类?

3
实现一个接口和继承实现相同接口的类会有什么问题吗?(除了混淆之外)
例如:
interface IDo
public abstract class DoIt implements IDo
public class IllDo extends DoIt implements IDo

(请忽略这句话,它看起来有误)


1
不应该有任何问题,只是实现相同接口两次是多余的。 - phflack
1个回答

9
当你扩展一个类时,你继承了它的整个接口,包括任何它实现的接口或派生类。因此,任何扩展DoIt的类都会自动实现IDo,因为它扩展了一个实现该接口的类。你可以在声明中放置implements子句,但它对类没有进一步的影响。然而,有时也有理由这样做,如这个问题所述:它记录了你特别意图让该类实现该接口,并意味着如果超类被修改而不再包含implements子句,子类要么会出现错误(因为它缺少接口要求的某些内容),要么保留其原始合同。

1
重新声明接口可能至少应该在您的IDE中引发警告,但它不太可能会导致问题(除了可能需要IllDo直接覆盖IDo中的每个成员)。 - Draco18s no longer trusts SE
1
我无法决定它是否应该是no-op(因为超类已经有了这些方法),还是强制子类提供自己的方法。 - Draco18s no longer trusts SE
2
从我的角度来看,这并不是毫无意义/误导性的。实际上,非常流行的java.util.Collection框架也遵循了同样的约定。为什么ArrayList有“implements List”?,但我知道这纯粹是基于个人观点的。(无论哪种方式都不会有任何区别,最终结果都一样)。 - rajuGT
@T.J.Crowder 是的,我同意。也许旧版本支持此功能,也可能不支持,我不确定。但是,在IDE中开发/维护代码时,如果我们需要查看ArrayList或这里的IllDo类的层次结构,我们需要查看其父类(即是否实现了接口)。因此,如果我们添加implements子句,就很容易知道它的类型,并且很容易遍历/移动代码。(仍然基于个人观点):P :) - rajuGT
我已经完成了我的实现,这个设置实际上是需要发现一个扩展基类的osgi服务组件,而基类实现了api接口。如果在服务组件上没有实现api接口,则在扫描服务组件的捆绑包时无法找到服务组件。此外,在某些情况下,使用Java反射查找实现接口的某些类也可能是必要的。但在正常情况下,这确实是毫无意义的。 - Tinus Tate
显示剩余3条评论

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