java 方法返回类型不是实际类型。例如,
public interface Foo<X extends TypeA> {
public X hello();
}
public class Bar implements Foo<TypeB> {
@Override
public TypeB hello() {
...
}
}
Method method = Bar.class.getDeclaredMethod("hello");
Class returnType = method.getReturnType();
returnType 是TypeA
,不是TypeB
。 TypeB
是 TypeA
的子类。
如何获取方法的实际返回类型?它是 TypeB
,而不是 TypeA
。
更新
我用过
Method[] methods = Bar.class.getDeclaredMethods();
然后遍历这些方法。该方法返回父类(super class)。验证 getDeclaredMethod("hello") 确实返回子类类型。他们为什么不同?
最佳答案
如果您使用 getDeclaredMethods()
遍历所有已声明的方法,您会发现两个具有相似签名的方法:
TypeB hello()
(这是您所期望的)TypeA hello()
(这是你说的那个)
查看字节码会发现以下条目:
public hello()Ltest/TypeB;
//... the bytecode for your method
public synthetic bridge hello()Ltest/TypeA;
//... bytecode that delegates to hello()Ltest/TypeB
这是 javac 编译器的一个效果,它引入了一个合成桥接方法 TypeA hello()
,它只委托(delegate)给 TypeB hello()
。
原因是只能调用具有相同签名的方法。由于接口(interface)签名是 TypeA hello()
,因此对接口(interface)的任何调用都将在实现中调用 TypeA hello()
。但是您的类 Bar
不包含此方法,而是包含一个替代方法 TypeB hello()
。为了解决这个问题,javac 选择桥接该方法(将其委托(delegate)给替换方法)。我认为这会在运行时为他们节省大量工作。
所以你的问题不是方法返回错误的类型,而是你的代码返回了错误的方法。如果您迭代这些方法,请对它们调用 isSynthetic()
(true 表示它不是感兴趣的方法)。
关于java方法返回类型不是实际类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50770696/