java之封装ArrayList

转载请注明出处

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,建立自己的只允许特定类型的ArrayList,如下代码:

public class MouseList 
{
	private ArrayList list = new ArrayList();
	public void add(Mouse m)
	{
		list.add(m);
	}
	
	public Mouse get(int index)
	{
		return (Mouse)list.get(index);
	}

	public int size()
	{
		return list.size();
	}
}


思考一个问题,如果采用上面这种封装的形式,而是继承ArrayList,能不能达到同样的效果呢?


                

你可能感兴趣的:(java,继承,程序员,object,ArrayList)