将Fruit改为flist (#632)

原文:but to upcast to flist, that type is a “don’t actually care
This commit is contained in:
huakaimay 2020-12-14 15:36:11 +08:00 committed by GitHub
parent 963abc9397
commit 4e513bb43d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2666,7 +2666,7 @@ public class GenericsAndCovariance {
}
```
**flist** 的类型现在是 `List<? extends Fruit>`,你可以读作“一个具有任何从 **Fruit** 继承的类型的列表”。然而,这实际上并不意味着这个 **List** 将持有任何类型的 **Fruit**。通配符引用的是明确的类型,因此它意味着“某种 **flist** 引用没有指定的具体类型”。因此这个被赋值的 **List** 必须持有诸如 **Fruit****Apple** 这样的指定类型,但是为了向上转型为 **Fruit**,这个类型是什么没人在意。
**flist** 的类型现在是 `List<? extends Fruit>`,你可以读作“一个具有任何从 **Fruit** 继承的类型的列表”。然而,这实际上并不意味着这个 **List** 将持有任何类型的 **Fruit**。通配符引用的是明确的类型,因此它意味着“某种 **flist** 引用没有指定的具体类型”。因此这个被赋值的 **List** 必须持有诸如 **Fruit****Apple** 这样的指定类型,但是为了向上转型为 **flist**,这个类型是什么没人在意。
**List** 必须持有一种具体的 **Fruit****Fruit** 的子类型,但是如果你不关心具体的类型是什么,那么你能对这样的 **List** 做什么呢?如果不知道 **List** 中持有的对象是什么类型,你怎能保证安全地向其中添加对象呢?就像在 **CovariantArrays.java** 中向上转型一样,你不能,除非编译器而不是运行时系统可以阻止这种操作的发生。你很快就会发现这个问题。