Skip to content

Update 20-Generics.md #487

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 27, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/book/20-Generics.md
Original file line number Diff line number Diff line change
Expand Up @@ -2957,7 +2957,7 @@ public class UnboundedWildcards2 {
```

但是,当你拥有的全都是无界通配符时,就像在 `Map<?,?>` 中看到的那样,编译器看起来就无法将其与原生 **Map** 区分开了。另外, **UnboundedWildcards1.java** 展示了编译器处理 `List<?>` 和 `List<? extends Object>` 是不同的。
令人困惑的是,编译器并非总是关注像 `List` 和 `List<?>` 之间的这种差异,因此它们看起来就像是相同的事物。事实上,因为泛型参数擦除到它的第一个边界,因此 `List<?>` 看起来等价于 `List<Object>` ,而 **List** 实际上也是 `List<Object>` ——除非这些语句都不为真。**List** 实际上表示“持有任何 **Object** 类型的原生 **List ** ”,而 `List<?>` 表示“具有某种特定类型的非原生 **List** ,只是我们不知道类型是什么。”
令人困惑的是,编译器并非总是关注像 `List` 和 `List<?>` 之间的这种差异,因此它们看起来就像是相同的事物。事实上,因为泛型参数擦除到它的第一个边界,因此 `List<?>` 看起来等价于 `List<Object>` ,而 **List** 实际上也是 `List<Object>` ——除非这些语句都不为真。**List** 实际上表示“持有任何 **Object** 类型的原生 **List** ”,而 `List<?>` 表示“具有某种特定类型的非原生 **List** ,只是我们不知道类型是什么。”
编译器何时才会关注原生类型和涉及无界通配符的类型之间的差异呢?下面的示例使用了前面定义的 `Holder<T>` 类,它包含接受 **Holder** 作为参数的各种方法,但是它们具有不同的形式:作为原生类型,具有具体的类型参数以及具有无界通配符参数:

```java
Expand Down