泛型在容器中的安全问题 --《JAVA编程思想》 61

今天和大家聊聊泛型在容器中存在的安全问题,我们先来看一个例子。

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 时,会抛出类型转换异常,使得我们在数据插入阶段就发现不良数据。

本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

おすすめ

転載: blog.csdn.net/BaymaxCS/article/details/120836288
おすすめ