想申明一个ArrayList:DogArrayList,让他只能保存类Dog的对象。然后就可以(Dog)DogArrayList.get(i);看起来很简单,很自然的想法。但是这里有一个问题。JAVA的集合都是保存对象,而不会自动的做类型检测。也就是说你也可以把Cat类型的东西add到DogArrayList里面,对此JAVA是欣然接受的,但是却在(Dog)DogArrayList.get(i)时抛出异常!为了解决这个问题,我们很自然的想到,生成自己的类,继承ArrayList,然后在其中强制其只接受Dog类的对象,于是产生了如下代码:
public class DogArrayList extends ArrayList
{
List al=new ArrayList();
public void add(Dog d){
al.add(d);
}
...
}通过继承,然后重载add(Object o)方法,看起来好像已经达到目的,但是结果一测试,发现Cat依旧可以专到Dog窝里!why?!其实原因很简单,这里只是覆盖,那么当Cat跑过来,发现身份不符时,就会去匹配基类的add(Object o)方法。诶,这下行了,所以他就顺利的混了进去!
那么该怎么办你?!其实也很简单,不用继承,用组合,就可以了!
public class DogArrayList
{
List al=new ArrayList();
public void add(Dog d){
al.add(d);
}
...
}
就少了,一个继承关系,就OK了!所以,在继承的时候一定要留意这个问题,不要让被覆盖的类偷偷的执行,从而坏了你的大事!
对JAVA集合类,进行类型限制 不能用继承,用组合,因为继承时被覆盖的方法会在类型匹配的情况下得以运行