通常,数组与泛型不能很好的结合,你不能实例化具有参数化类型的数组。擦除会移除参数类型信息,而数组必须知道它们所持有的确切类型。但是我们可以参数化数组本身。
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 }