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



当实现具有泛型返回类型的方法并在实现类上反映声明的方法时,反射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上声明了?

为了支持协变返回类型,必须创建一个桥接方法,以便能够在期望声明的返回类型的代码中调用该方法。

简而言之,这个桥接方法是在以下场景中调用的方法,其中T被擦除为Object:

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

使用m.isBridge()来判断哪个是桥接方法

相关内容

  • 没有找到相关文章

最新更新