gpt4 book ai didi

java - 导致 NoSuchMethodError 的显式转换?

转载 作者:行者123 更新时间:2023-12-03 22:59:36 28 4
gpt4 key购买 nike

我想弄明白为什么我的两个 Java 库很难很好地协同工作。这是场景:

库 1 有一个类 A,其构造函数如下:

public A(Object obj) { /* boilerplate */ }

在以前的版本中,A 的构造函数是:

public A(Serializable s) { /* more or less same boilerplate */ }

现在库 2 是针对以前的版本构建的,并构造了 A 的一个实例:

A myObject = new A( (Serializable) arg);

当库 1(最新版本)和库 2 一起部署时,构造函数调用会抛出 NoSuchMethodError,堆栈跟踪说明 JVM 正在寻找具有可序列化参数的构造函数。

在我看来,所有对象实例都可以转换为 Object,即使在调用期间显式转换为接口(interface)也是如此。然而,这个实验证明并非如此。对于后代,谁能详细说明导致 NoSuchMethodError 出现的 Java 规则是什么?如果能引用规范,我将不胜感激。

最佳答案

new A(...) 调用的方法在编译库 2 时解析,其签名存储在库 2 的类文件中。

如果针对旧版本的库 1 编译库 2,则 A myObject = new A( (Serializable) arg) 的字节码将类似于:

   9:   new #1;     //class A
12: aload_1 //arg
13: invokespecial #24; //Method "<init>":(Ljava/io/Serializable;)V

如果在调用此代码时具有此签名的方法不再存在,您将收到 NoSuchMethodError

关于java - 导致 NoSuchMethodError 的显式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8081749/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com