-->

什么是“覆盖等价”,以及如何将它应用到@Override有关?(What is “override-

2019-09-01 02:42发布

读的Javadoc的@Override注释,我遇到了以下规则:

如果一个方法与此注解类型的编译器需要除非满足下列条件中的至少一个保持,以产生一个错误消息:

  • 该方法不覆盖或实现超类中声明的方法。
  • 该方法具有一个特征就是覆盖,等同于对象声明的任何公共方法。

我在第一点清楚,但我不能确定第二个。

这是什么的“覆盖相当于”呢? 怎么样的公共方法Object特别在这方面? 而这是为什么不是第一标准所涵盖的?

更新注意:这是唯一真正的Java 7的文档。 在Java 6的文档不说的覆盖等价什么。 为什么要改变?


更新:

咨询JLS(后第8.4.2节 ),我发现覆盖等价的如下解释:

一个方法的签名m1是一个方法的签名的一个子签名 m2如果任:

  • m2具有相同签名的m1 ,或
  • 的签名m1相同擦除( §4.6的签名) m2

两个方法签名m1m2倍率相当于当且仅当任一m1是一个子签名m2m2是的子签名m1

据我所知,这回答了第一个问题(“这是什么意思?”)和第三个问题(“为什么不第一条件覆盖吗?”)。

如果我理解正确(请告诉我,如果我不知道!),只有一种情况下两种方法是覆盖等效并且原题的第一条件下下跌。 这是这样,当子类方法的签名的擦除是一样的超类方法的签名,而不是周围的其他方法。

原来问题的第二个条件,然后,将才开始发挥作用时,我们尝试添加类型参数试图“覆盖”了的公共方法时, Object类。 我尝试以下简单的例子来测试这一点,用一个未使用的类型参数:

public class Foo {
    @Override
    public <T> boolean equals(Object obj) {
        return true;
    }
}

当然,这个类没有编译,因为该方法不实际覆盖equals方法,因此与它相撞。 但我也仍然收到错误使用@Override注释。 我错了的假设,这是第二种情况的一个有效例子@Override使用? 或者是编译器,尽管没有被要求产生这个错误?

Answer 1:

这样做的原因是为了让你使用@Override的接口注释,不继承Object ,但隐式声明的所有公共方法Object (见JLS节9.2接口的成员 )。 因此,你被允许申报等的接口:

interface Bar { @Override int hashCode(); }

然而,你将不会被允许声明如下界面:

interface Quux { @Override Object clone(); }

由于clone()方法不会隐在接口中声明(这是不public )。

这在描述JLS节9.6.3.4 @覆盖 (为的Javadoc @Override仍指旧区段号)



Answer 2:

你提的问题基本上是一个设计问题,JLS解释它:

“子签名的概念设计为表达两种方法,其特征是不相同的,但是其中的一个可能会覆盖其他之间的关系,具体而言,它允许一个方法,其签名不使用通用类型来覆盖该方法的任何泛型版本这一点很重要,这样库的设计者可以自由泛型化方法独立的定义子类或库的子接口的客户端“。

您的代码是不是这样一个有效的示例,请参见下面的代码它的工作原理:

public class SubSignatureTest extends SignatureTest {

    @Override
    public List test(Collection p) {
        return null;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

class SignatureTest {

    public <T> List<T> test(Collection<T> t) {
        return null;

    }
}

整点是超和子类的签名应该是擦除后相同。

编辑:当我们谈论覆盖等价的那么父类应该有泛型方法和子类应该有非泛型方法。 下面是一个例子来解释这个。下面的代码将不能工作,因为子类有泛型方法。 有那么一刻让我们假设的Java允许该则在main方法的调用总是失败:

class A{
       public int compareTo(Object o){
               return 0;
       }
}

class B extends A implements Comparable<B>{
       public int compareTo(B b){
               return 0;
       }

       public static void main(String[] argv){
               System.out.println(new B().compareTo(new Object()));
       }
}

在B类方法是这样的编译后:

public int compareTo(Object x){
    return compareTo((B)x);
  }

这意味着这始终是错误: new B().compareTo(new Object()) 因此java会不会让子类有泛型方法,如果父类有非泛型方法。 所以你不能定义对象类覆盖等效方法。

希望澄清。

我用了后http://lists.seas.upenn.edu/pipermail/types-list/2006/001091.html参考,它有很多的更多细节。



文章来源: What is “override-equivalence” and how is it related to @Override?