|
| 1 | +《《《 [返回首页](../README.md) <br/> |
| 2 | +《《《 [上一节](03_Exception_Handling.md) |
| 3 | + |
1 | 4 | ## 数组创建 |
2 | 5 |
|
3 | | -数组通过它们的组件类型来进行通用化,这意味着它们携带有关组件类型的运行时信息。 此实体类型信息用于实例测试和强制转换,还用于检查是否允许分配到数组组件。 |
| 6 | +数组通过它们的组件类型来进行通用化,这意味着它们携带有关组件类型的运行时信息。 此实体类型信息用于实例测试和强制转换,还用于检查是否允许分配到数组组 |
| 7 | +件。 |
| 8 | + |
4 | 9 | 回想一下第 `2.5` 节中的这个例子。 |
5 | 10 |
|
6 | 11 | ```java |
|
9 | 14 | nums[2] = 3.14; // 数组存储异常 |
10 | 15 | ``` |
11 | 16 |
|
12 | | -第一行分配一个新数组,其中指定它是一个整数数组。 第二行将此数组赋给一个包含数字数组的变量; 这是允许的,因为与泛型类型不同,数组是协变的。 第三行的赋值在运行时引发了一个数组存储异常,因为赋值是 `double` 类型的,并且这与附加到数组的指定类型不兼容。 |
| 17 | +第一行分配一个新数组,其中指定它是一个整数数组。 第二行将此数组赋给一个包含数字数组的变量; 这是允许的,因为与泛型类型不同,数组是协变的。 第三行的赋 |
| 18 | +值在运行时引发了一个数组存储异常,因为赋值是 `double` 类型的,并且这与附加到数组的指定类型不兼容。 |
13 | 19 |
|
14 | | -因为数组必须确定其组件类型,所以创建一个新数组是错误的,除非其组件类型是可验证的。 您可能遇到的两个主要问题是数组的类型是一个类型变量,并且数组的类型是参数化类型。 |
| 20 | +因为数组必须确定其组件类型,所以创建一个新数组是错误的,除非其组件类型是可验证的。 您可能遇到的两个主要问题是数组的类型是一个类型变量,并且数组的类型 |
| 21 | +是参数化类型。 |
15 | 22 |
|
16 | 23 | 考虑以下(不正确)代码将集合转换为数组: |
17 | 24 |
|
18 | 25 | ```java |
19 | 26 | import java.util.*; |
20 | 27 | class Annoying { |
21 | 28 | public static <T> T[] toArray(Collection<T> c) { |
22 | | - T[] a = new T[c.size()]; // compile-time error |
23 | | - int i=0; for (T x : c) a[i++] = x; |
| 29 | + T[] a = new T[c.size()]; // 编译错误 |
| 30 | + int i=0; for (T x : c) a[i++] = x; |
24 | 31 | return a; |
25 | 32 | } |
26 | 33 | } |
|
31 | 38 | ```java |
32 | 39 | % javac Annoying.java |
33 | 40 | Annoying.java:4: generic array creation |
34 | | - T[] a = new T[c.size()]; // compile-time error |
| 41 | + T[] a = new T[c.size()]; // 编译错误 |
35 | 42 | ^ |
36 | 43 | 1 error |
37 | 44 | ``` |
|
46 | 53 | public static List<Integer>[] twoLists() { |
47 | 54 | List<Integer> a = Arrays.asList(1,2,3); |
48 | 55 | List<Integer> b = Arrays.asList(4,5,6); |
49 | | - return new List<Integer>[] {a, b}; // compile-time error |
| 56 | + return new List<Integer>[] {a, b}; // 编译错误 |
50 | 57 | } |
51 | 58 | } |
52 | 59 | ``` |
|
56 | 63 | ```java |
57 | 64 | % javac AlsoAnnoying.java |
58 | 65 | AlsoAnnoying.java:6: generic array creation |
59 | | - return new List<Integer>[] {a, b}; // compile-time error |
| 66 | + return new List<Integer>[] {a, b}; // 编译错误 |
60 | 67 | ^ |
61 | 68 | 1 error |
62 | 69 | ``` |
63 | 70 |
|
64 | 71 | 我们也很快讨论这个问题的解决方法。 |
65 | 72 |
|
66 | | -无法创建通用数组是 `Java` 中最严重的限制之一。因为它太讨厌了,所以值得重申其发生的原因:通用数组是有问题的,因为泛型是通过擦除来实现的,但是擦除是有益的,因为它简化了进化。 |
67 | | - |
68 | | -最好的解决方法是使用 `ArrayList` 或来自集合框架的其他类优先于数组。我们在 `2.5` 节中讨论了集合类和数组之间的权衡,并且我们注意到在很多情况下集合比数组更好:因为它们在编译时捕获更多的错误,因为它们提供更多的操作,并且因为它们提供了更多的表示灵活性。到目前为止,数组提供的问题的最佳解决方案是“只是说不”:使用集合优先于数组。 |
69 | | - |
70 | | -有时候这不起作用,因为为了兼容性或效率的原因你需要一个数组。这种情况的例子发生在集合框架中:为了兼容性,`toArray` 方法将集合转换为数组;为了提高效率,通过将列表元素存储在一个数组中来实现类数组列表。我们将在下面的章节中详细讨论这两种情况,以及帮助您避免这些情况的相关陷阱和原则:广告真相原则和不雅暴露原则。我们也考虑可变参数和通用数组的创建带来的问题。 |
71 | | - |
72 | | - |
73 | | - |
74 | | - |
75 | | - |
76 | | - |
77 | | - |
78 | | - |
79 | | - |
80 | | - |
81 | | - |
82 | | - |
83 | | - |
84 | | - |
85 | | - |
86 | | - |
87 | | - |
88 | | - |
89 | | - |
90 | | - |
91 | | - |
92 | | - |
93 | | - |
94 | | - |
95 | | - |
96 | | - |
97 | | - |
98 | | - |
99 | | - |
100 | | - |
101 | | - |
102 | | - |
103 | | - |
104 | | - |
105 | | - |
106 | | - |
107 | | - |
| 73 | +无法创建通用数组是 `Java` 中最严重的限制之一。因为它太讨厌了,所以值得重申其发生的原因:通用数组是有问题的,因为泛型是通过擦除来实现的,但是擦除是有 |
| 74 | +益的,因为它简化了进化。 |
108 | 75 |
|
| 76 | +最好的解决方法是使用 `ArrayList` 或来自集合框架的其他类优先于数组。我们在 `2.5` 节中讨论了集合类和数组之间的权衡,并且我们注意到在很多情况下集合比数 |
| 77 | +组更好:因为它们在编译时捕获更多的错误,因为它们提供更多的操作,并且因为它们提供了更多的表示灵活性。到目前为止,数组提供的问题的最佳解决方案是“只是说 |
| 78 | +不”:使用集合优先于数组。 |
109 | 79 |
|
| 80 | +有时候这不起作用,因为为了兼容性或效率的原因你需要一个数组。这种情况的例子发生在集合框架中:为了兼容性,`toArray` 方法将集合转换为数组;为了提高效 |
| 81 | +率,通过将列表元素存储在一个数组中来实现类数组列表。我们将在下面的章节中详细讨论这两种情况,以及帮助您避免这些情况的相关陷阱和原则:广告真相原则和不 |
| 82 | +雅暴露原则。我们也考虑可变参数和通用数组的创建带来的问题。 |
110 | 83 |
|
| 84 | +《《《 [下一节](05_The_Principle_of_Truth_in_Advertising.md) <br/> |
| 85 | +《《《 [返回首页](../README.md) |
0 commit comments