Java Reflection getDeclaredMethods() returns 泛型覆盖方法的两个版本

Java Reflection getDeclaredMethods() returns two versions of generic overridden methods

我需要使用反射 API 来获取有关 class 中方法的方法参数的准确信息。 考虑以下最小示例:

public class A<T> {
  void test(T t, List<String> l) {}
}

public class B extends A<Integer> {
  @Override
  void test(Bar t, List<String> l) {}
}

public class Main{
  public static void main() {
    Method[] methods = B.class.getDeclaredMethods();
    for (Method m : methodsB) {
      System.out.println(m);
      System.out.println(m.getGenericParameterTypes()[1] instanceof ParameterizedType)
    }
  }
}

这将导致

void B.test(java.lang.Integer,java.util.List)
true
void B.test(java.lang.Object,java.util.List)
false

我的问题是:

  1. 为什么 getDeclaredMethods() 输出 两个 方法而不是一个?如果 test 没有泛型参数或者它是 B 的新方法(未被覆盖),getDeclaredMethods() 将按预期仅输出一个方法。
  2. 什么是过滤掉不包含通用类型信息的“错误”方法的可靠且通用的方法?

正如 Pshemo 指出的那样,第二种不太具体的方法是 桥接方法 (https://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html),它用作类型擦除的一种方法。

可以使用 method.isBridge() 来识别桥接方法。