封装ArrayList

来源:互联网 发布:手机当作网络摄像头 编辑:程序博客网 时间:2024/06/01 10:42

转载请注明出处

http://blog.csdn.net/pony_maggie/article/details/44786233

ArrayList很好用,可以添加任意类型,动态增长,各种库函数支持,如下是个简单示例:

public class FillingList {        /**      * @param args      * fill只会对已经存在空间填充,所以下面的for循环必不可少      */      public static void main(String[] args)       {          // TODO Auto-generated method stub          List<String> list = new ArrayList<String>();                    for (int i = 0; i < 10; i++)           {              list.add("");          }                    Collections.fill(list, "hello");          System.out.println(list);        }    } 
它存在一个问题,就是不知道add进来的类型。因为add方法本身接受的是Object类型,当我们取出来列表中的内容使用时,需要强制转换实际的类型,如下所示:

public static void main(String[] args)       {          ArrayList cats = new ArrayList();          for(int i = 0; i < 7; i++)          {              cats.add(new Cat(i));          }                              for(int i = 0; i < 7; i++)          {              ((Cat)cats.get(i)).print();          } 
如果程序员忘记了原来add进来的类型,然后在get的时候,转换成错误的实际类型了,就像下面这样,会怎样呢?
public class CatsAndDogs   {        /**      * @param args      */      public static void main(String[] args)       {          ArrayList cats = new ArrayList();          for(int i = 0; i < 7; i++)          {              cats.add(new Cat(i));          }                    cats.add(new Dog(7));                    for(int i = 0; i < 7; i++)          {              ((Cat)cats.get(i)).print();          }                    for(int i = 0; i < cats.size(); i++)          {              ((Cat)cats.get(i)).print();          }          //dog is detected at run time        }    }  
答案是编译没有问题,运行时才会报错。这样就会有很大的风险。

所以需要对ArrayList进行封装

public class AutoArrayList extends ArrayList{     private Class itemClass;     public AutoArrayList(Class itemClass){         this.itemClass = itemClass;     }    public Object get(int index){       try{             while(index>=size()){             add(itemClass.newInstance());             }         }catch(Exception e){             e.printStackTrace();           }        return super.get(index);    }}