【问题标题】:implicit super-interface in Java?Java中的隐式超级接口?
【发布时间】:2009-04-29 17:39:35
【问题描述】:

所以我们都知道所有的类都隐式地扩展了 Object。接口呢?有隐式的超级接口吗?我说有。以下代码编译:

java.io.Serializable s1 = null;
java.io.Serializable s2 = null;

s1.equals(s2);

equals 方法不是在 Serializable 中声明的,而是在 Object 中声明的。由于接口只能扩展其他接口,而 Object 是一个类,而不是接口,因此必须有一些隐式接口正在被扩展。然后Object 类必须隐式实现这个隐式接口(哇,写起来很奇怪)。

那么,问题是,这有多正确?

【问题讨论】:

  • 我不明白你的论点是“必须有一些隐式接口正在被扩展”。您如何从我们在这里看到的结论中得出这个结论?
  • 附带说明,此代码将抛出 NullPointerException 而无法正常工作。
  • 我从未说过它会运行。我专门说它会编译。
  • 完全不正确。你会发现 JLS 中没有提到超级接口。

标签: java interface


【解决方案1】:

由于接口只能扩展其他 接口,而 Object 是一个类,而不是 一个接口,必须有一些 隐式接口 扩展。

没有。引用Java Language Specification

如果接口没有直接 超级接口,然后是接口 隐式声明一个公共摘要 带有签名s的成员方法 m, 返回类型 r,并抛出子句 t 对应每个公共实例 方法 m,签名为s,返回类型 r 和 throws 子句 t 在 对象,除非有相同的方法 签名、相同的返回类型和一个 兼容的 throws 子句是明确的 由接口声明。如果接口显式,则为编译时错误 在这种情况下声明这样一个方法 m 其中 m 被声明为最终的 对象。

这与您的“隐式超级接口”之间的区别在于Object 有许多 final 和 protected 方法,而您不能在接口中使用这些修饰符。

【讨论】:

    【解决方案2】:

    s1 和 s2 这里是对象引用,指的是实现 Serializable 的对象的实例。 Java中没有接口引用之类的东西。

    所以 Java 知道无论这些对象是什么,它们都是 java.lang.Object 的后代。因此上面的代码是有效的。

    【讨论】:

      【解决方案3】:

      当您声明如下内容时:

      java.io.Serializable s1 = null;
      

      不要忘记 Java 中的所有内容都派生自 Object。所以在这里,你只是说s1somethingObject 或某个扩展Object 的类)implements Serializable。没有魔法。 Java 中的所有内容都派生自Object,无论是否显式。因此,equals 方法始终可用。

      【讨论】:

      • 也许我遗漏了一些东西,但是如何声明一个变量“声明一个类型”?
      【解决方案4】:

      我认为没有任何超级界面。

      当你像这样声明一个变量时:

      java.io.Serializable s1 = null;
      

      你还没有创建任何Object

      编译器知道s1s2 将实现Serializable 并将继承自Object,因此它允许equals

      【讨论】:

        猜你喜欢
        • 2012-04-10
        • 2019-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多