//: generics/GenericReading.java // ©2015 MindView LLC: see Copyright.txt import java.util.*; public class GenericReading { static T readExact(List list) { return list.get(0); } static List apples = Arrays.asList(new Apple()); static List fruit = Arrays.asList(new Fruit()); // A static method adapts to each call: static void f1() { Apple a = readExact(apples); Fruit f = readExact(fruit); f = readExact(apples); } // If, however, you have a class, then its type is // established when the class is instantiated: static class Reader { T readExact(List list) { return list.get(0); } } static void f2() { Reader fruitReader = new Reader<>(); Fruit f = fruitReader.readExact(fruit); // Fruit a = fruitReader.readExact(apples); // Error: // readExact(List) cannot be // applied to (List). } static class CovariantReader { T readCovariant(List list) { return list.get(0); } } static void f3() { CovariantReader fruitReader = new CovariantReader<>(); Fruit f = fruitReader.readCovariant(fruit); Fruit a = fruitReader.readCovariant(apples); } public static void main(String[] args) { f1(); f2(); f3(); } } ///:~