java方法返回类型不是实际类型

标签 java methods reflection return-type

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,不是TypeBTypeBTypeA 的子类。

如何获取方法的实际返回类型?它是 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/

相关文章:

java - 触及项目结构,现在项目找不到任何包

java - 在编译时未评估的接口(interface)中定义的最终静态字符串 - Android

Java 方法和泛型

java - 注释处理的正确位置在哪里?

Java hibernate声明连接有效

c# - 如何解析和执行命令行样式字符串?

javascript - 为什么对象不通过原型(prototype)链继承方法?

c++ - 如何获取指向函数第一个参数的指针?

方法的 C# 字符串表示

java - 通过ProcessBuilder运行脚本后收集java中的环境变量