当实现具有泛型返回类型的方法并在实现类上反映声明的方法时,反射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()
来判断哪个是桥接方法