今天和大家聊聊泛型在容器中存在的安全问题,我们先来看一个例子。
public class Pet {}
public class Dog extends Pet {}
public class Cat extends Pet {}
public class PelList {
public static void main(String[] args) {
List dogs = new ArrayList<Dog>();
dogs.add(new Cat());
Dog dog = (Dog) dogs.get(0);
}
}
Exception in thread "main" java.lang.ClassCastException: mtn.baymax.charpter15.Cat cannot be cast to mtn.baymax.charpter15.Dog
at mtn.baymax.charpter15.PelList.main(PelList.java:15)
JAVA 为兼容 SE5 版本之前的代码,是可以向老代码传递泛型容器的。但容器存储的数据类型在放入时,并不能接受类型检查,只有在取出的时候才能捕获到异常。
那么,我们能在往容器放入数据的时候就进行类型检查嘛?
java.util.Collections 中的一组工具类可以帮我们解决这个问题,它们分别是:checkedCollection()、checkedList()、checkedMap()、checkedSortedMap()、checkedSortedMap()。这些方法的第一个参数为需要进行类型检查的容器,第二个参数(和第三个参数)为强制要求类型的 class 对象。
这里给大家演示其中的 checkedList() 的用法。
public class PelList {
public static void main(String[] args) {
List dogs = Collections.checkedList(new ArrayList<Dog>(), Dog.class);
dogs.add(new Cat());
}
}
Exception in thread "main" java.lang.ClassCastException: Attempt to insert class mtn.baymax.charpter15.Cat element into collection with element type class mtn.baymax.charpter15.Dog
at java.util.Collections$CheckedCollection.typeCheck(Collections.java:3037)
at java.util.Collections$CheckedCollection.add(Collections.java:3080)
at mtn.baymax.charpter15.PelList.main(PelList.java:16)
当我们试图往存储 Dog 类型的集合插入 Cat 时,会抛出类型转换异常,使得我们在数据插入阶段就发现不良数据。
本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。
若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!
|