在签名中使用相同签名和异常的多重继承方法,从而导致运行时错误

时间:2016-02-28 17:24:22

标签: java inheritance location polymorphism

有人可以向我解释为什么我用下面的代码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)

0 个答案:

没有答案