Java 仅返回值类型不同的同名方法,他们的签名不一样,如何在一个类中实现同时存在?

    // new method
    protected String constructScalar(ScalarNode node) {
        return node.getValue();
    }

    // old method
    protected Object constructScalar(ScalarNode node) {
        return node.getValue();
    }

在一段旧程序里,调用的是 old method ,签名里的返回值类型是Object,而依赖库里的类是新的,只有 new method ,这时程序调用会报java.lang.NoSuchMethodError,如何才能把新旧方法都给它塞进去,让旧程序也能正确调用。

阅读 5.2k
2 个回答

编译器无法通过,字节码可以存在是因为Java SourceJVM的语义不同造成的.解决类似问题的方式采用bridgeMethod桥接方法解决两者的语义冲突.楼主最后一句话表明想把上述两个方法塞到一个类里面,既然楼主知道字节码存在两个方法,而编译器不通过.那么楼主所说的把两个方法塞一个类里就是想在编译器里解决这个问题,那么这个问题就是无解的,因为这是Java语义的规定,我们不可打破.不过从楼主的问题来看,我猜测是想根据一个if(condition)来决定使用老版本的方法还是新版本的方法.基于reflectClass.getDeclaredMethod(String name,Class<?>...paramterTypes)只能根据方法名和参数类型来获取执行方法,但是在当前的场景中显然是不满足的,因为还少一个判断条件,即return type.当然你也可以使用getDeclaredMethod()获取所有的Method,不过还有一个更便捷的API,即MethodHandles.可以根据return type更准确的获取JVM认知的方法

java方法重载是不以返回类型来区分的,毕竟要是按返回类型来区分但我们有不将返回值赋给一个变量,那编译器就懵了到底调用那个方法?所以仅仅返回值不一样但两个方法是无法塞到同一个类里的。你的情景描述不太清楚,是否可以用继承覆盖老的方法来解决。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题