From 441c5e11f253ce99ffd143379e2c9b672c8cd2d8 Mon Sep 17 00:00:00 2001 From: xiangflight Date: 2019年12月12日 20:33:56 +0800 Subject: [PATCH] =?UTF-8?q?revision[21]=20=E5=A2=9E=E9=87=8F=E7=94=9F?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/book/21-Arrays.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/book/21-Arrays.md b/docs/book/21-Arrays.md index bda4af74..4bd62127 100644 --- a/docs/book/21-Arrays.md +++ b/docs/book/21-Arrays.md @@ -567,7 +567,7 @@ Lazy, Brown, Dog, &, friend]] 同样的,在 **Integer** 和 **Double** 数组中,自动装箱可为你创建包装器对象。 -## 泛型数组 +## 数组与泛型 一般来说,数组和泛型并不能很好的结合。你不能实例化参数化类型的数组: @@ -575,7 +575,7 @@ Lazy, Brown, Dog, &, friend]] Peel[] peels = new Peel[10]; // Illegal ``` -类型擦除需要删除参数类型信息,而且数组必须知道它们所保存的确切类型,以强制保证类型安全。 +类型擦除会擦除参数类型信息,而数组必须知道它们所保存的确切类型,以强制保证类型安全。 但是,可以参数化数组本身的类型: @@ -604,7 +604,7 @@ public class ParameterizedArrayType { } ``` -比起使用参数化类,使用参数化方法很方便。您不必为应用它的每个不同类型都实例化一个带有参数的类,但是可以使它成为 **静态** 的。你不能总是选择使用参数化方法而不用参数化的类,但通常参数化方法是更好的选择。 +比起使用参数化类,使用参数化方法很方便。您不必为应用它的每个不同类型都实例化一个带有参数的类,而可以使它成为 **静态** 的。你不能总是选择使用参数化方法而不用参数化类,但通常参数化方法是更好的选择。 你不能创建泛型类型的数组,这种说法并不完全正确。是的,编译器不会让你 *实例化* 一个泛型的数组。但是,它将允许您创建对此类数组的引用。例如: @@ -649,7 +649,7 @@ public class ArrayOfGenerics { 一旦你有了对 **List[]** 的引用 , 你会发现多了一些编译时检查。问题是数组是协变的,所以 **List[]** 也是一个 **Object[]** ,你可以用这来将 **ArrayList ** 分配进你的数组,在编译或者运行时都不会出错。 -如果你知道你不会进行向上类型转换,你的需求相对简单,那么可以创建一个泛型数组,它将提供基本的编译时类型检查。然而,一个泛型 **Collection** 实际上是一个比泛型数组更好的选择。 +如果你知道你不会进行向上类型转换,你的需求相对简单,那么可以创建一个泛型数组,它将提供基本的编译时类型检查。然而,一个泛型 **Collection** 几乎永远是一个比泛型数组更好的选择。 一般来说,您会发现泛型在类或方法的边界上是有效的。在内部,擦除常常会使泛型不可使用。所以,就像下面的例子,不能创建泛型类型的数组: @@ -670,12 +670,10 @@ public class ArrayOfGenericType { ``` -擦除再次从中作梗,这个例子试图创建已经擦除的类型数组,因此它们是未知的类型。你可以创建一个 **对象** 数组,然后对其进行强制类型转换,但如果没有 **@SuppressWarnings** 注释,你将会得到一个 "unchecked" 警告,因为数组实际上不真正支持而且将对类型 **T** 动态检查 。这就是说,如果我创建了一个 **String[]** , Java将在编译时和运行时强制执行,我只能在数组中放置字符串对象。然而,如果我创建一个 **Object[]** ,我可以把除了基元类型外的任何东西放入数组。 - - +擦除再次从中作梗,这个例子试图创建已经擦除的类型数组,因此它们是未知的类型。你可以创建一个 **对象** 数组,然后对其进行强制类型转换,但如果没有 **@SuppressWarnings** 注释,你将会得到一个 "unchecked" 警告,因为数组实际上不真正支持而且将对类型 **T** 动态检查 。这就是说,如果我创建了一个 **String[]**,Java 将在编译时和运行时强制只能在数组中放置字符串对象。然而,如果我创建一个 **Object[]**,我可以把除了基元类型外的任何东西放入数组。 -## Arrays的fill方法 +## Arrays 的 fill 方法 通常情况下,当对数组和程序进行实验时,能够很轻易地生成充满测试数据的数组是很有帮助的。 Java 标准库 **Arrays** 类包括一个普通的 **fill()** 方法,该方法将单个值复制到整个数组,或者在对象数组的情况下,将相同的引用复制到整个数组: @@ -735,20 +733,22 @@ a9: [Hello, Hello, Hello, World, World, Hello] ``` -你既可以填充整个数组,也可以像最后两个语句所示,填充一系列的元素。但是由于你只能使用单个值调用 **Arrays.fill()** ,因此结果并非特别有用。 - +你既可以填充整个数组,也可以像最后两个语句所示,填充一个范围内的元素。但是由于你只能调用 **Arrays.fill()** 填充单个值,因此结果并非特别有用。 -## Arrays的setAll方法 -在Java 8中, 在**RaggedArray.java** 中引入并在 **ArrayOfGenerics.java.Array.setAll()** 中重用。它使用一个生成器并生成不同的值,可以选择基于数组的索引元素(通过访问当前索引,生成器可以读取数组值并对其进行修改)。 **static Arrays.setAll()** 的重载签名为: +## Arrays 的 setAll 方法 + +在 **RaggedArray.java** 中引入并在 **ArrayOfGenerics.java** 中使用的 **Arrays.setAll()** 诞生自 Java 8。它使用一个生成器并生成不同的值,可以选择基于数组的索引元素(通过访问当前索引,生成器可以读取数组值并对其进行修改)。**static Arrays.setAll()** 的重载方法签名有: * **void setAll(int[] a, IntUnaryOperator gen)** * **void setAll(long[] a, IntToLongFunction gen)** * **void setAll(double[] a, IntToDoubleFunctiongen)** * ** void setAll(T[] a, IntFunction gen)** -除了 **int** , **long** , **double** 有特殊的版本,其他的一切都由泛型版本处理。生成器不是 **Supplier** 因为它们不带参数,并且必须将 **int** 数组索引作为参数。 +除了 **int** , **long** , **double** 有特殊的版本,其他的一切都由泛型版本处理。生成器不是 **Supplier** 因为它们不带参数,并且必须将 **int** 类型的数组索引作为参数。 + +下面是一个使用 lambda 表达式和方法引用的简单 `setAll()` 代码示例: ```java // arrays/SimpleSetAll.java @@ -811,10 +811,10 @@ public class SimpleSetAll { * **[1]** 这里,我们只是将数组索引作为值插入数组。这将自动转化为 **long** 和 **double** 版本。 * **[2]** 这个函数只需要接受索引就能产生正确结果。这个,我们忽略索引值并且使用 **val** 生成结果。 * **[3]** 方法引用有效,因为 **Bob** 的构造器接收一个 **int** 参数。只要我们传递的函数接收一个 **int** 参数且能产生正确的结果,就认为它完成了工作。 -* **[4]** 为了处理除了 **int** ,**long** ,**double** 之外的基元类型,请为基元创建包装类的数组。然后使用 **setAll()** 的泛型版本。请注意,**getChar()** 生成基元类型,因此这是自动装箱到 **Character** 。 - +* **[4]** 为了处理除了 **int** ,**long** ,**double** 之外的基元类型,需要为基元创建包装类的数组。然后使用 **setAll()** 的泛型版本。请注意,**getChar()** 生成基元类型,因此这里自动装箱成 **Character**。 + ## 增量生成 这是一个方法库,用于为不同类型生成增量值。

AltStyle によって変換されたページ (->オリジナル) /