Skip to content

Commit 55b7b83

Browse files
authored
Update 04_Array_Creation.md
1 parent 243b26c commit 55b7b83

File tree

1 file changed

+25
-50
lines changed

1 file changed

+25
-50
lines changed

ch06/04_Array_Creation.md

Lines changed: 25 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](03_Exception_Handling.md)
3+
14
## 数组创建
25

3-
数组通过它们的组件类型来进行通用化,这意味着它们携带有关组件类型的运行时信息。 此实体类型信息用于实例测试和强制转换,还用于检查是否允许分配到数组组件。
6+
数组通过它们的组件类型来进行通用化,这意味着它们携带有关组件类型的运行时信息。 此实体类型信息用于实例测试和强制转换,还用于检查是否允许分配到数组组
7+
件。
8+
49
回想一下第 `2.5` 节中的这个例子。
510

611
```java
@@ -9,18 +14,20 @@
914
nums[2] = 3.14; // 数组存储异常
1015
```
1116

12-
第一行分配一个新数组,其中指定它是一个整数数组。 第二行将此数组赋给一个包含数字数组的变量; 这是允许的,因为与泛型类型不同,数组是协变的。 第三行的赋值在运行时引发了一个数组存储异常,因为赋值是 `double` 类型的,并且这与附加到数组的指定类型不兼容。
17+
第一行分配一个新数组,其中指定它是一个整数数组。 第二行将此数组赋给一个包含数字数组的变量; 这是允许的,因为与泛型类型不同,数组是协变的。 第三行的赋
18+
值在运行时引发了一个数组存储异常,因为赋值是 `double` 类型的,并且这与附加到数组的指定类型不兼容。
1319

14-
因为数组必须确定其组件类型,所以创建一个新数组是错误的,除非其组件类型是可验证的。 您可能遇到的两个主要问题是数组的类型是一个类型变量,并且数组的类型是参数化类型。
20+
因为数组必须确定其组件类型,所以创建一个新数组是错误的,除非其组件类型是可验证的。 您可能遇到的两个主要问题是数组的类型是一个类型变量,并且数组的类型
21+
是参数化类型。
1522

1623
考虑以下(不正确)代码将集合转换为数组:
1724

1825
```java
1926
import java.util.*;
2027
class Annoying {
2128
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;
2431
return a;
2532
}
2633
}
@@ -31,7 +38,7 @@
3138
```java
3239
% javac Annoying.java
3340
Annoying.java:4: generic array creation
34-
T[] a = new T[c.size()]; // compile-time error
41+
T[] a = new T[c.size()]; // 编译错误
3542
^
3643
1 error
3744
```
@@ -46,7 +53,7 @@
4653
public static List<Integer>[] twoLists() {
4754
List<Integer> a = Arrays.asList(1,2,3);
4855
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}; // 编译错误
5057
}
5158
}
5259
```
@@ -56,55 +63,23 @@
5663
```java
5764
% javac AlsoAnnoying.java
5865
AlsoAnnoying.java:6: generic array creation
59-
return new List<Integer>[] {a, b}; // compile-time error
66+
return new List<Integer>[] {a, b}; // 编译错误
6067
^
6168
1 error
6269
```
6370

6471
我们也很快讨论这个问题的解决方法。
6572

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+
益的,因为它简化了进化。
10875

76+
最好的解决方法是使用 `ArrayList` 或来自集合框架的其他类优先于数组。我们在 `2.5` 节中讨论了集合类和数组之间的权衡,并且我们注意到在很多情况下集合比数
77+
组更好:因为它们在编译时捕获更多的错误,因为它们提供更多的操作,并且因为它们提供了更多的表示灵活性。到目前为止,数组提供的问题的最佳解决方案是“只是说
78+
不”:使用集合优先于数组。
10979

80+
有时候这不起作用,因为为了兼容性或效率的原因你需要一个数组。这种情况的例子发生在集合框架中:为了兼容性,`toArray` 方法将集合转换为数组;为了提高效
81+
率,通过将列表元素存储在一个数组中来实现类数组列表。我们将在下面的章节中详细讨论这两种情况,以及帮助您避免这些情况的相关陷阱和原则:广告真相原则和不
82+
雅暴露原则。我们也考虑可变参数和通用数组的创建带来的问题。
11083

84+
《《《 [下一节](05_The_Principle_of_Truth_in_Advertising.md) <br/>
85+
《《《 [返回首页](../README.md)

0 commit comments

Comments
 (0)