Merge pull request #201 from YngwieWang/patch-1

[hotfix] fix some minor errors
This commit is contained in:
Joe
2019-08-11 22:23:51 +08:00
committed by GitHub

View File

@@ -68,7 +68,7 @@ ndOrangesWithoutGenerics.java:23)
在运行时,当尝试将 **Orange** 对象转为 **Apple** 时,会出现输出中显示的错误。
在[泛型]()章节中,你将了解到使用 Java 泛型来创建类可能很复杂。但是,使用预先定义的泛型类却相当简单。例如,要定义一个用于保存 **Apple** 对象的 **ArrayList** ,只需要使用 **ArrayList\<Apple>** 来代替 **ArrayList** 。尖括号括起来的是*类型参数*(可能会有多个),它指定了这个集合实例可以保存的类型。
在[泛型]()章节中,你将了解到使用 Java 泛型来创建类可能很复杂。但是,使用预先定义的泛型类却相当简单。例如,要定义一个用于保存 **Apple** 对象的 **ArrayList** ,只需要使用 **ArrayList<Apple>** 来代替 **ArrayList** 。尖括号括起来的是*类型参数*(可能会有多个),它指定了这个集合实例可以保存的类型。
通过使用泛型,就可以在编译期防止将错误类型的对象放置到集合中。[^3]下面还是这个示例,但是使用了泛型:
```java
@@ -94,17 +94,17 @@ public class ApplesAndOrangesWithGenerics {
*/
```
**apples** 定义的右侧,可以看到 `new ArrayList<>()` 。这有时被称为“菱形语法”(diamond syntax)。在 Java 7 之前,必须要在两端都进行类型声明,如下所示:
**apples** 定义的右侧,可以看到 `new ArrayList<>()` 。这有时被称为“菱形语法”diamond syntax。在 Java 7 之前,必须要在两端都进行类型声明,如下所示:
```java
ArrayList<Apple> apples = new ArrayList<Apple>();
```
随着类型变得越来越复杂,这种重复产生的代码非常混乱且难以阅读。程序员发现所有类型信息都可以从左侧获得,因此,编译器没有理由强迫右侧再重复这些。Java语言团队采纳了这种*类型推断*type inference的请求,即使只是这么小的一点
随着类型变得越来越复杂,这种重复产生的代码非常混乱且难以阅读。程序员发现所有类型信息都可以从左侧获得,因此,编译器没有理由强迫右侧再重复这些。虽然*类型推断*type inference只是个很小的请求Java 语言团队仍然欣然接受并进行了改进
有了 **ArrayList** 声明中的类型指定,编译器会阻止将 **Orange** 放入 **apples** ,因此,这会成为一个编译期错误而不是运行时错误。
使用泛型,从 **List** 中获取元素不需要强制类型转换。因为 **List** 知道它持有什么类型,因此当调用 `get()` 时,它会替你执行转型。这样,不仅可以知道编译器将检查放入集合的对象类型,而且在使用集合中的对象时可以使用更加清晰的语法。
使用泛型,从 **List** 中获取元素不需要强制类型转换。因为 **List** 知道它持有什么类型,因此当调用 `get()` 时,它会替你执行转型。因此,使用泛型,你不仅知道编译器将检查放入集合的对象类型,而且在使用集合中的对象时可以获得更清晰的语法。
当指定了某个类型为泛型参数时,并不仅限于只能将确切类型的对象放入集合中。向上转型也可以像作用于其他类型一样作用于泛型:
```java