public interface MyInterface {}
public class A implements MyInterface{}
public class B implements MyInterface{}
public class Tester {
public static void main(String[] args){
MyInterface a = new A();
MyInterface b = new B();
test(b); // this is wrong
}
public static void test(A a){
System.out.println("A");
}
public static void test(B b){
System.out.println("B");
}
}
您正在尝试将MyInterface
引用变量引用的对象传递给使用其子类型(如test(B b)
. 编译器在这里抱怨,因为MyInterface
引用变量可以引用任何子类型的MyInterface
对象,但不一定是 的对象B
。如果在 Java 中允许这样做,可能会出现运行时错误。举一个例子,这将使您的概念更清晰。我已经修改了你的类代码B
并添加了一个方法。
public class B implements MyInterface {
public void onlyBCanInvokeThis() {}
}
现在只需更改如下test(B b)
方法:
public static void test(B b){
b.onlyBCanInvokeThis();
System.out.println("B");
}
如果编译器允许,此代码将在运行时崩溃:
MyInterface a = new A();
// since a is of type A. invoking onlyBCanInvokeThis()
// inside test() method on a will throw exception.
test(a);
为了防止这种情况,编译器不允许使用超类引用的这种方法调用技术。
我不确定您要实现什么目标,但似乎您想要实现运行时多态性。为此,您需要在您的方法中声明一个方法MyInterface
并在每个子类中实现它。这样,对方法的调用将在运行时根据对象类型而不是引用类型来解决。
public interface MyInterface {
public void test();
}
public class A implements MyInterface{
public void test() {
System.out.println("A");
}
}
public class B implements MyInterface{
public void test() {
System.out.println("B");
}
}
public class Tester {
public static void main(String[] args){
MyInterface a = new A();
MyInterface b = new B();
b.test(); // calls B's implementation of test()
}
}