有人可以向我解释为什么我用下面的代码Scratch.java得到运行时NoSuchMethodError错误?如果方法m1没有抛出任何异常,我不会收到错误。如果接口A,B和X没有通用类型M,我也不会收到任何错误。如果Y直接实现A和B而不是通过中间接口实现,我也不会收到任何错误X.但是如果我有三个 - 方法签名中的异常,泛型类型和中间接口 - 我得到一个运行时错误,如下所示。仅供参考,我检查过String和Long类型并不重要,可能是原始的或原始的。
我很感激任何指向Java文档的指针,例如, http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.4.4 或解释此观察结果的方法位置规则。
import java.io.IOException;
import java.util.Arrays;
class Scratch {
interface A<M> {
public int m1(String arg1, M arg2) throws IOException;
}
interface B<M> {
public int m1(String arg1, M arg2) throws IOException;
}
interface X<M> extends A<M>, B<M> {
}
class Y<M> implements X<M> {
@Override
public int m1(String arg1, M arg2) throws IOException {
System.out.println("Invoked m1(String, M) from "
+ this.getClass().getSimpleName());
return 1;
}
}
public static void main(String[] args) throws IOException {
Y<Long> y = new Scratch().new Y<Long>();
X<Long> x = y;
String arg1 = "something";
Long arg2 = 23L;// new String("fddsfs");
try {
y.m1(arg1, arg2); // gives no error
x.m1(arg1, arg2);
} catch (NoSuchMethodError e) {
System.err.println("Method m1 not found in "
+ x.getClass().getSimpleName() + "; methods = "
+ Arrays.asList(x.getClass().getDeclaredMethods()));
e.printStackTrace();
}
}
}
我得到以下输出:
Invoked m1(String, M) from Y
Method m1 not found in Y; methods = [public int edu.umass.cs.scratch.Scratch$Y.m1(java.lang.String,java.lang.Object) throws java.io.IOException]
java.lang.NoSuchMethodError: edu.umass.cs.scratch.Scratch$X.m1(Ljava/lang/String;Ljava/lang/Long;)I
at edu.umass.cs.scratch.Scratch.main(Scratch.java:417)