问题
我正在重构/移植一个使用具有两个版本的外部 API 的应用程序,我们将它们称为 API 1.0 和 API 2.0。 它使用API 2.0,但决定它应该支持API 1.0,而不必编译两个单独的应用程序。
API 2.0(几乎)与 1.0 相同,但具有额外的方法。 我将我的 Maven POM 配置为使用 API 1.0 作为依赖项并修复(使用兼容的 API)出现的所有编译错误
但是我面临以下问题: 当使用API 2.0编译时,它运行良好:
- API 2.0
- API 1.0
但是,当使用API 1.0进行编译时,它仅在API 1.0上运行良好,并在API 2.0上抛出NoSuchMethodException。
我跟踪了该问题并显示在以下代码中:
使用
import test.A;
public class Test {
public static void main(String...args) {
A a = new A();
a.sayHello();
}
}
API 1.0
package test;
public class A {
public A sayHello() {
System.out.println("Hello from API 1.0");
return this;
}
}
API 2.0
package test;
public class A extends B<A> {}
class B<T> {
public T sayHello() {
System.out.println("Hello from API 2.0");
return (T) this;
}
}
编译并运行它们
$ java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b16)
OpenJDK 64-Bit Server VM (build 25.111-b16, mixed mode)
该方法是存在的,但是似乎需要 A sayHello() 而不是 T sayHello()。尽管T实际上是A。 据我了解,这似乎是静态与动态绑定(bind)问题。
问题
有没有办法保留 API 1.0 作为我的依赖项?
它非常适合在运行前发现错误。因此,强制动态绑定(bind)或使用 API 1.0 作为依赖项,但使用 API 2.0 或类似的东西进行编译对我来说很有用。
感谢您的宝贵时间。
最佳答案
您只能选择这两个 API 之一,因为无法区分使用 API 1 或 API 2 方法。
NoSuchMethodException 表示需要某个方法,但找不到它。
您也许能够使用反射来编译和运行可用的 API。
关于java - 强制动态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40937530/