通常,数组与泛型不能很好的结合,你不能实例化具有参数化类型的数组。擦除会移除参数类型信息,而数组必须知道它们所持有的确切类型。但是我们可以参数化数组本身。
1 1 import java.util.ArrayList; 2 2 import java.util.Arrays; 3 3 import java.util.LinkedList; 4 4 import java.util.List; 5 5 6 6 class ClassParameter<T> { 7 7 public T[] f(T[] arg) { 8 8 return arg; 9 9 } 1010 } 1111 1212 class MethodParameter { 1313 public static <T> T[] f(T[] arg) { 1414 return arg; 1515 } 1616 } 1717 1818 public class ParameterizedArrayType { 1919 public static void main(String[] args) { 2020 // List<String>[] ls = new List<String>[5]; // Compile ERROR: 不能实例化具有参数化类型的数组 2121 List<String>[] ls = new List[5]; // 这样可以 2222 ls[0] = new ArrayList<>(); 2323 // ls[1] = new ArrayList<Integer>(); // Compile ERROR: 类型不匹配 2424 ls[2] = new LinkedList<>(); 2525 // 但是我们可以参数化数组本身。 2626 Integer[] ints = {1, 2, 3, 4, 5}; 2727 Double[] doubles = {1.1, 2.2, 3.3, 4.4, 5.5}; 2828 Integer[] ints2 = new ClassParameter<Integer>().f(ints); 2929 Double[] doubles2 = new ClassParameter<Double>().f(doubles); 3030 System.out.println(Arrays.toString(ints2)); // [1, 2, 3, 4, 5] 3131 System.out.println(Arrays.toString(doubles2)); // [1.1, 2.2, 3.3, 4.4, 5.5] 3232 ints2 = MethodParameter.f(ints); 3333 doubles2 = MethodParameter.f(doubles); 3434 System.out.println(Arrays.toString(ints2)); // [1, 2, 3, 4, 5] 3535 System.out.println(Arrays.toString(doubles2)); // [1.1, 2.2, 3.3, 4.4, 5.5] 3636 } 3737 }