【问题标题】:Confusion of javadoc on `Class.getDeclaredMethod``Class.getDeclaredMethod` 上的 javadoc 混淆
【发布时间】:2018-03-22 06:11:48
【问题描述】:

Class.getDeclaredMethod 有以下 javadoc。

如果这个 Class 对象代表一个有多个声明的类型 具有相同名称和参数类型但返回不同的方法 types,则返回的数组对于每个这样的都有一个 Method 对象 方法。

我知道我们不能重载具有相同名称和参数类型的方法。那么这个文档是什么意思呢?

【问题讨论】:

  • 编译器合成的泛型桥接方法可能会发生这种情况。
  • 我相信其他 JVM 语言也会出现这种情况,虽然我不知道是哪种。
  • @EJP 否。桥接方法具有不同的参数类型。合成方法始终遵循方法规范,除非您手动编写字节码。
  • @Andreas 我也相信...但是将这些混淆的句子写入 javadoc 仅用于其他语言似乎有点太没必要了。

标签: java reflection overloading


【解决方案1】:

作为EJP said in a comment:

编译器合成的泛型桥接方法可能会发生这种情况。

其实,它不仅仅适用于泛型。

只要子类使用不同的返回类型覆盖方法,编译器就会创建合成桥方法。

以下代码演示了这一点:

public class Super {
    public static void main(String... args) throws Exception {
        for (Method method : Sub.class.getDeclaredMethods())
            System.out.println(method + (method.isSynthetic() ? " **SYNTHETIC**" : ""));
    }
    public Number get() {
        return Double.NaN;
    }
}
class Sub extends Super {
    @Override
    public Integer get() {
        return 42;
    }
}

输出

public java.lang.Integer Sub.get()
public java.lang.Number Sub.get() **SYNTHETIC**

【讨论】:

  • 1+ 子类使用不同的返回类型覆盖方法 这称为协变返回类型,这是 AFAIK 中唯一可能发生这种情况的两种情况
猜你喜欢
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 2019-01-12
  • 2022-11-10
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多