使用java容器有个缺点,在将对象加入容器的时候就丢失了类型信息。因为容器类的程序设计人员不关系你想要添加入容器的对象的具体类型。如果容器只能保存你自己的类型,就失去了作为通用工具的意义。所以容器只保存对Object的引用,Object是所有类的基类,因此容器可以保存任何类型的对象。这是了不起的解决方式,不过也有两个缺点。
(1)因为在将对象的引用加入容器的时候就丢失了类型的信息,所以对于填入容器的对象没有类型的限制,及时可以保持容器的类型,例如“猫”的容器,别人还是可以轻易的将“狗” 放入容器。
例如 :
List cats = new ArrayList();
for(int i = 0 ; i<7 ; i++)
{
cats.add(new cat(i)); //cat加入容器后,类型丢失
}
cats.add(new dog(7)); //不能阻止“狗”放入容器
(2)因为丢失了类型信息,所以容器只知道它保存的是指向对象的引用。在使用容器的元素前必须要做好类型转换,转换为正确类型。
例如:
List cats = new ArrayList();
for(int i = 0 ; i<7 ; i++)
{
cats.add(new cat(i)); //cat加入容器后,类型丢失
}
for(int i = 0; i<cats.size(); i++)
(cats.get(i)).id(); //必须转换为正确的类型
综合举例:


















以上在编译时,不会有错误,但是在运行时,发生转换错误。
运行情况:
D:/temp>java catsanddogs
cat # 0
cat # 1
cat # 2
cat # 3
cat # 4
cat # 5
cat # 6
Exception in thread "main" java.lang.ClassCastException: dog cannot be cast to c
at
at catsanddogs.main(catsanddogs.java:15)