大家好,
我感到有些尴尬,因为我要问一个很幼稚的问题。但是我不明白一件事情,我的继承结构如下所示:
B 继承自 A,我编写的代码如下:
Class A
public class A{
private int pos = 0;
public A(){
this.pos = 12;
}
public int getPos(){
return this.pos;
}
}
类 B
public class B extends A{
int spec = 15;
public B(){
super();
}
public int getSpec(){
return this.spec;
}
}
我还有一个测试类需要执行,这将引出我的问题。
测试类
import java.util.*;
public class Test{
public static void main(String[] args){
B a = new B();
ArrayList<A> c = new ArrayList<A>();
c.add(a);
System.out.println(c.get(0).getPos());
System.out.println(c.get(0).getSpec());
}
}
问题:现在我正在创建B的实例,这意味着我可以访问我的父类的方法
getPos()
和B自己的方法getSpec()
。但是,如果我使用类型为A(...B也是类型A,因为它扩展了A...)创建ArrayList并添加我的B实例,则它失去了访问自己方法的能力。我做错了什么?ArrayList实现是否在内部将我的B转换为A?注意:我的继承基本理解是父类不能访问子类的方法,除非它们是受保护的。但是子类可以访问其父类的方法。
A
和B
上调用相同的方法,那就不要担心类型,只需让A
和B
实现相同的接口。或者,在A
中放置一个存根方法,让B
可以覆盖它。 - Matt BallList<Foo>
或者更宽松的约束,比如Collection<Foo>
或者Iterable<Foo>
是一个很好的实践。正如我在之前的评论中所说:不要担心对象的类型。开始思考你可以用它做什么。 - Matt Ball