假设我有以下课程:
class B extends A
class C extends A
class D extends B
列表:
List<A> mylist,
来自不同阶层的对象:
A b = new B();
A c = new C();
B d = new D();
B b2 = new B();
以下哪项是正确的?为什么?
mylist.add(b);
mylist.add(c);
mylist.add(d);
mylist.add(b2);
这两种声明方式有什么区别:B b2 = new B()和A b = new B();
对象b和c的引用类型是A,所以我认为这两行代码是正确的,对不对?那么另外两个呢?
我问这个问题的原因是因为我想实现这个功能:
//calculate method in different class will do different calculation.
class A{
int calculate(int parameter1, int parameter2){
return parameter1*parameter2;
}
}
class B extends A{
int calculate(int parameter1, int parameter2){
return parameter1+parameter2;
}
}
class C extends A{
int calculate(int parameter1, int parameter2){
return parameter1-parameter2;
}
}
class D extends B{
int calculate(int parameter1, int parameter2){
return parameter1/parameter2;
}
}
A b = new B();
A c = new C();
B d = new D();
B b2 = new B();
List<A> mylist;
mylist.add(b);
mylist.add(c);
mylist.add(d);
mylist.add(b2);
// TODO hundreds of objects from subclass of A are added into this list
Iterator<A> iterator = mylist.iterator();
while(iterator.hasNext()){
System.out.println(iterator.calculate(2,1));
}
答案 0 :(得分:1)
他们都是正确的,因为他们都是A的子类。
答案 1 :(得分:1)
所有这些类都直接或间接地扩展A
,因此可以将所有实例添加到List<A>
实例。
你究竟要问的是什么?
答案 2 :(得分:0)
作为A
,B
,C
,D
都可以被引用到A
,myList
被强制包含A
引用,您的所有示例都将成功添加到列表中。