实现具有泛型返回类型的方法时通过反射的多个方法

时间:2014-06-11 17:03:35

标签: java generics reflection

当实现具有泛型返回类型的方法并在实现类上反映声明的方法时,反射API会返回两个方法。例如:

interface Referenceable<T> {
    T getReference();
}

class UUIDRef implements Referenceable<UUID> {
    public UUID getReference() {
      System.out.println("You called");
      return null;
    }
}

@Test
public void test() throws Exception {
    UUIDRef ref = new UUIDRef();
    for (Method m : UUIDRef.class.getDeclaredMethods()) {
      System.out.println(String.format("%s %s", m.getReturnType(), m.getName()));
      m.invoke(ref, null);
    }
}

输出:

class java.util.UUID getReference You called class java.lang.Object getReference You called

为什么我在UUIDRef上声明了两个方法?有没有办法准确地了解哪两个是最精炼的,实际上是在UUIDRef上宣布的?

1 个答案:

答案 0 :(得分:2)

为了支持协变返回类型,a bridge method must be created能够在需要声明返回类型的代码中调用该方法。

简而言之,此桥接方法是在以下方案中调用的方法,其中T被删除为Object

public <T> T doSomething(Referenceable<T> obj) {
   return obj.getReference();
}

使用m.isBridge()来确定哪种桥接方法。