当实现具有泛型返回类型的方法并在实现类上反映声明的方法时,反射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
上宣布的?
答案 0 :(得分:2)
为了支持协变返回类型,a bridge method must be created能够在需要声明返回类型的代码中调用该方法。
简而言之,此桥接方法是在以下方案中调用的方法,其中T
被删除为Object
:
public <T> T doSomething(Referenceable<T> obj) {
return obj.getReference();
}
使用m.isBridge()
来确定哪种桥接方法。