Java泛型(9):动态类型安全
因为可以向Java SE5之前的代码传递泛型容器,所以旧式代码仍有可能破坏你的容器。Java SE5中有一组便利工具,可以解决这种情况下类型检查的问题。
它们是静态方法checkedCollection(); checkedList(); checkedMap(); checkedSet(); checkedSortedMap(); checkedSortedSet();
这些方法的第一个参数是你希望动态检查的容器,第二个参数是你希望强制要求的类型。当受检查的容器插入不正确的对象时会抛出ClassCastException。
1 public class Test { 2 @SuppressWarnings("unchecked") 3 static void oldStyleMethod(List probablyAppels) { 4 probablyAppels.add(new Banana()); 5 } 6 public static void main(String[] args) { 7 List<Apple> apples1 = new ArrayList<>(); 8 oldStyleMethod(apples1); 9 List<Apple> apples2 = Collections.checkedList( 10 new ArrayList<>(), Apple.class); 11 try { 12 oldStyleMethod(apples2); 13 } catch(Exception e) { 14 System.out.println(e); 15 // java.lang.ClassCastException: Attempt to insert class chapter15.class13.Banana element into collection with element type class chapter15.class13.Apple 16 } 17 List<Fruit> pets = Collections.checkedList( 18 new ArrayList<>(), Fruit.class); 19 pets.add(new Apple()); 20 pets.add(new Banana()); 21 } 22 } 23 24 class Fruit {} 25 class Apple extends Fruit {} 26 class Banana extends Fruit {}