// generics/CheckedList.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using Collection.checkedList() import reflection.pets.*; import java.util.*; public class CheckedList { @SuppressWarnings("unchecked") static void oldStyleMethod(List probablyDogs) { probablyDogs.add(new Cat()); } public static void main(String[] args) { List dogs1 = new ArrayList<>(); oldStyleMethod(dogs1); // Quietly accepts a Cat List dogs2 = Collections.checkedList( new ArrayList<>(), Dog.class); try { oldStyleMethod(dogs2); // Throws an exception } catch(Exception e) { System.out.println("Expected: " + e); } // Derived types work fine: List pets = Collections.checkedList( new ArrayList<>(), Pet.class); pets.add(new Dog()); pets.add(new Cat()); } } /* Output: Expected: java.lang.ClassCastException: Attempt to insert class reflection.pets.Cat element into collection with element type class reflection.pets.Dog */