动态类型安全主要是在泛型容器中遇到的。因为可以向JAVA EE5 之前的代码传递泛型容器,所以旧式代码仍旧有可能会破坏你的容器,JAVA EE5的java.util.Collections中有一组便利工具,可以解决在这种情况下的类型检查问题,它们是:静态方法checkedCollection()、checkedList()、checkedMap()、checkedSet()、checkedSortedMap()和checkedSortedSet()。这些方法每一个都会将你希望动态检查的容器当作第一个参数接受,并将你希望强制要求的类型作为第二个参数接受。
受检查的容器在你视图插入类型不正确的对象时会抛出ClassCastException异常,而不是在你将对象从容器中取出时才会通知你出现了问题。
- public class CheckedList{
- @SuppressWarnings("unchecked")
- static void oldStyleMethod(List probablyDogs){
- probablyDogs.add(new Cat());
- }
- public static void main(String[] args){
- List<Dog> dogs1 = new ArrayList<Dog>();
- oldStyleMethod(dogs1);
- List<Dog> dogs2 = Collections.checkedList(
- new ArrayList<Dog>(),Dog.class);
- try{
- oldStyleMethod(dogs2);
- }catch(Exception e){
- e.printStack();
- }
- List<Pet> pets = Collections.checkedList(new ArrayList<Pet>(),Pet.class);
- pets.add(new Dog());
- pets.add(new Cat());
- }
- }
运行这个程序时,你会发现插入一个Cat对于dogs1来说没有任何问题,而dogs2立即会在这个错误类型的插入操作上抛出一个异常。还可以看到,将子类的对象放置到将要检查基类型的受检查容器是没有问题的。