为什么此通用代码会产生 NoSuchMethodError?
2022-09-03 02:25:24
假设你有一个方法
- 取阈值和输入
- 如果输入小于阈值,则引发异常
- 否则返回输入
它看起来像这样:
<N extends Number & Comparable<N>, S extends N> S ensureLessThan(N threshold, S input) {
if (input.compareTo(threshold) >= 0) {
throw new IllegalArgumentException("Input " + input + " is not less than " + threshold);
}
return input;
}
运行时,此方法将抛出 :NoSuchMethodError
Exception in thread "main" java.lang.NoSuchMethodError: java.lang.Number.compareTo(Ljava/lang/Object;)I
添加看起来像冗余强制转换的内容使其工作:
...
if (((N) input).compareTo(threshold) >= 0) {
...
这到底是怎么回事呢?
更新:我的 Java 版本是
java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)
这里有一个可运行的例子:https://gist.github.com/4526536