【发布时间】:2015-08-27 13:41:04
【问题描述】:
为什么会出现以下输出/错误?
public class A1 {
public void bar() {
System.out.println("A1 bar");
}
public static void main(String[] args) {
List<A1> list = new ArrayList<>();
list.add(new B());
/* add the missing lines here*/
}
}
public interface A2 {
void foo(List<A1> list, int idx);
}
public class B extends A1 implements A2 {
public void foo(List<A1> list, int idx) {
A1 a1 = list.get(idx);
if (a1 instanceof B) {
System.out.println("It's a B!");
} else {
a1.bar();
}
}
public void bar() {
System.out.println("B bar");
}
}
1) 将以下几行添加到 main 时:
list.add(new A1());
A2 a=(A2) list.get(0);
a.foo.(list,1);
既然动态类型不能是接口,为什么没有编译错误? (输出为“A1 bar”)。
2) 为什么以下几行会导致“运行时错误”而不是“编译错误”?
list.add(new A1());
A2 a = (A2) list.get(1);
a.foo(list, 0);
3) 对于以下类层次结构是否正确:
Interface Animal {...}
class Dog implements Animals {...}
class Poodle extends Dog {...}
class Labrador extends Dog {...}
以下行无法编译,因为动态类型是接口?
Animal animal=(Animal) poodle;
【问题讨论】:
-
基本上你在继承自
A2的B:foo()方法中缺少@Override注释 -
尽可能避免使用
instanceof。使用polymorphism 代替它。