【问题标题】:Can an interface be a superclass? [duplicate]接口可以是超类吗? [复制]
【发布时间】:2014-12-01 14:23:02
【问题描述】:

Java documentaion 中声明:

@Override 注释通知编译器该元素旨在覆盖在超类中声明的元素。

我有一个类实现一个接口并且实现的方法语句有@Override注解。
这是否意味着(根据文档)接口是我的类的超类?但是,考虑到接口只包含“空”方法,而不是实际做事的方法,这怎么可能呢?

我的代码是 LibGDX 相关的:

public class MouseAndKeyboard implements ApplicationListener {
    private Texture plane1;
    private Sprite mainPlane;
    private SpriteBatch mainSpritePacket;

    @Override
    public void create() {
        float w = Gdx.graphics.getWidth();
        float h = Gdx.graphics.getHeight();

        ...

【问题讨论】:

  • 接口只能由接口扩展,但只能由抽象类或具体类实现
  • 教程是描述性文档; Javadoc 是规范的。如有疑问,您必须始终检查规范性文档。
  • 在 Java 6 之前,在继承的接口方法上使用 @Override 是不合法的。网页的该部分可能是尚未更新的旧文本。
  • @ITroubs 当链接指向教程页面时,您怎么知道?此外,DHall 在版本上是错误的:这种变化直到 Java 7 才发生。
  • @MarkoTopolnik 不,它是 java 6。如果你要打电话给我,至少检查你的事实

标签: java


【解决方案1】:

对于此类问题,最好查看 Javadoc。 Javadoc 提到“超类型”而不是“超类”:https://docs.oracle.com/javase/8/docs/api/java/lang/Override.html

【讨论】:

【解决方案2】:

@Override 也一直困扰着我,因为它既用于覆盖实际的超类方法,又用于实现接口方法。因此,taht 部分的文档并不是以最好的方式编写的。

考虑到接口只包含“空”方法

这不再是真的,在 Java 8 中,接口可以包含声明方法的默认实现。

【讨论】:

  • 并非“一直”如此; @Override 最初是在 Java 5 中引入的,其语义严格适用于覆盖。在 Java 7 中,这被扩展到实现,因为这样注释变得更加有用。不幸的是,它的误导性名称一直伴随着我们。
  • 假设Java中使用接口来提供多继承的手段,那么@Override就完全没有误导
  • @ITroubs 常识和 Java 语言规范同意“覆盖”不适用于实现接口方法。然而,当涉及到由类定义的抽象方法时,常识和 JLS 存在分歧:就 JLS 而言,这些是“覆盖”的。
  • @MarkoTopolnik 是的,我对always 的使用并不是最好的,只是指这种不确定性已经存在了一段时间。
  • @ITroubs multi-inheritance 通过接口也会误导恕我直言
【解决方案3】:

它还是叫接口,它可以防止你出错,所以你应该使用它。

签出 JSR http://docs.oracle.com/javase/specs/#9.6.4.4

第 9.6.4.4 章 @Override

还有:

Should we @Override an interface's method implementation?

【讨论】:

    【解决方案4】:

    文档中的解释有点草率。接口不是超类,因为一个类只能有一个超类,但可以实现多个接口。但是你仍然应该对接口方法使用@OverrideAnnotation 来表明这个方法是继承的(没有不同的 Annonation 仅适用于接口方法)。

    【讨论】:

    • 从纯面向对象的角度来看,接口是多继承的假冒版本
    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 2011-01-08
    • 2014-05-19
    • 2011-08-07
    • 2015-08-02
    • 1970-01-01
    • 2018-04-17
    • 2012-07-08
    相关资源
    最近更新 更多