gpt4 book ai didi

java - 什么是 "override-equivalence",它与 @Override 有什么关系?

转载 作者:太空狗 更新时间:2023-10-29 22:47:17 25 4
gpt4 key购买 nike

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

If a method is annotated with thisannotation type compilers are required to generate an error messageunless at least one of the following conditions hold:

  • The method does override or implement a method declared in a supertype.
  • The method has a signature that is override-equivalent to that of any public methoddeclared in Object.

我很清楚第一点,但我不确定第二点。

“覆盖等效”是什么意思? Object 的公共(public)方法在这方面有何特殊之处?为什么第一个标准没有涵盖这一点?

此外,这仅适用于 Java 7+ 文档。 Java 6 doc没有说任何关于覆盖等价的事情。为什么要改变?


更新:

进一步查阅JLS(Section 8.4.2)后,我发现了以下关于override-equivalence的解释:

The signature of a method m1 is a subsignature of the signature of a method m2 ifeither:

  • m2 has the same signature as m1, or
  • the signature of m1 is the same as the erasure (§4.6) of the signature of m2.

Two method signatures m1 and m2 are override-equivalent iff either m1 is asubsignature of m2 or m2 is a subsignature of m1.

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

如果我理解正确(如果我不理解请告诉我!),只有一种情况是两个方法是覆盖等效的并且属于第一个条件原来的问题。当子类方法的签名的删除与父类(super class)方法的签名相同时就是这种情况,反之则不然。

然后,原始问题的第二个条件只有在我们尝试“覆盖”Object 类的公共(public)方法时尝试添加类型参数时才会发挥作用。我尝试了以下简单示例来测试它,使用未使用的类型参数:

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

当然,这个类不会编译,因为该方法实际上没有覆盖equals 方法,因此与它发生冲突。但是我仍然收到使用 @Override 注释的编译器错误。我假设这个例子满足 @Override 用法的第二个条件是错误的吗?还是编译器生成此错误尽管不需要

最佳答案

这样做的原因是允许您在接口(interface)中使用@Override注解,它不继承自Object而是隐式声明来自的所有公共(public)方法对象(参见 JLS section 9.2 interface members )。因此,您可以声明如下接口(interface):

interface Bar { @Override int hashCode(); }

但是,您不能声明以下接口(interface):

interface Quux { @Override Object clone(); }

因为clone() 方法没有在接口(interface)中隐式声明(它不是public)。

这在 JLS section 9.6.3.4 @Override 中有描述(@Override 的 Javadoc 仍然引用旧的节号)

关于java - 什么是 "override-equivalence",它与 @Override 有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16207386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com