通常,数组与泛型不能很好的结合,你不能实例化具有参数化类型的数组。擦除会移除参数类型信息,而数组必须知道它们所持有的确切类型。但是我们可以参数化数组本身。
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.LinkedList; 4 import java.util.List; 5 6 class ClassParameter<T> { 7 public T[] f(T[] arg) { 8 return arg; 9 } 10 } 11 12 class MethodParameter { 13 public static <T> T[] f(T[] arg) { 14 return arg; 15 } 16 } 17 18 public class ParameterizedArrayType { 19 public static void main(String[] args) { 20 // List<String>[] ls = new List<String>[5]; // Compile ERROR: 不能实例化具有参数化类型的数组 21 List<String>[] ls = new List[5]; // 这样可以 22 ls[0] = new ArrayList<>(); 23 // ls[1] = new ArrayList<Integer>(); // Compile ERROR: 类型不匹配 24 ls[2] = new LinkedList<>(); 25 // 但是我们可以参数化数组本身。 26 Integer[] ints = {1, 2, 3, 4, 5}; 27 Double[] doubles = {1.1, 2.2, 3.3, 4.4, 5.5}; 28 Integer[] ints2 = new ClassParameter<Integer>().f(ints); 29 Double[] doubles2 = new ClassParameter<Double>().f(doubles); 30 System.out.println(Arrays.toString(ints2)); // [1, 2, 3, 4, 5] 31 System.out.println(Arrays.toString(doubles2)); // [1.1, 2.2, 3.3, 4.4, 5.5] 32 ints2 = MethodParameter.f(ints); 33 doubles2 = MethodParameter.f(doubles); 34 System.out.println(Arrays.toString(ints2)); // [1, 2, 3, 4, 5] 35 System.out.println(Arrays.toString(doubles2)); // [1.1, 2.2, 3.3, 4.4, 5.5] 36 } 37 }