List<Object>不是List<String>的父類型 數組是協變的
//若是 A 擴展 B,那麼 A 的數組也是 B 的數組,而且徹底能夠在須要B[]的地方使用A[]: Integer[] intArray = new Integer[10]; Number[] numberArray = intArray; //對於泛型來講,下面的代碼是無效的 List<Integer> intList = new ArrayList<Integer>(); List<Number> numberList = intList; // invalid
List<?>是任何泛型List的父類型 加入你有如下代碼:數組
List<Integer> list = new List<Integer>(); printList(list);//×:編譯error void printList(List<Object> l) { for (Object o : l) { System.out.println(o); } }
編譯失敗,由於List<Integer>不是一個List<Object>(非協變的) 解決方案就是使用通配符安全
List<Integer> list = new List<Integer>(); printList(list);//×:編譯error void printList(List<?> l) { for (Object o : l) { System.out.println(o); } }
public static < K1 extends Serializable, V1 extends Encodable < K1 >> Decoder < K1, V1 > create( V1[] values ) { return new Decoder < K1, V1 >( values ); }
*當泛型方法是靜態的時,這種狀況下不能使用類類型參數 *
public class Matrix<V extends Number> { ... }
編譯器容許您建立Matrix<Integer>或Matrix<Float>類型的變量, 可是若是您試圖定義 Matrix<String>類型的變量,則會出現錯誤。code