File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 3030 public < T > void show(T arg) {
3131 System . out. println(arg);
3232 }
33-
3433```
3534
3635
@@ -54,9 +53,7 @@ List<? super View> list1 = new ArrayList<>();
5453- 如果** 参数之间的类型有依赖关系** ,或者返** 回值是与参数之间有依赖关系** 的。那么就使用** 泛型方法**
5554- 如果** 没有依赖关系** 的,就使用** 通配符** ,通配符会** 灵活一些.**
5655
57- 静态属性是无法使用泛型的。泛型对应的都是具体的对象。静态方法初始化的时候泛型还有具体的对象,此时是没有意义的。
58-
59-
56+ ** 静态属性是无法使用泛型的。泛型对应的都是具体的对象。静态方法初始化的时候泛型还没有具体的对象,此时是没有意义的。**
6057
6158
6259
Original file line number Diff line number Diff line change @@ -47,7 +47,7 @@ error: incompatible types: Plate<Apple> cannot be converted to Plate<Fruit>
4747* 苹果 IS-A 水果
4848* 装苹果的盘子 NOT-IS-A 装水果的盘子
4949
50- 所以,就算容器里装的东西之间有继承关系,但容器之间是没有继承关系的。所以我们不可以把 Plate 的引用传递给 Plate。
50+ 所以,** 就算容器里装的东西之间有继承关系,但容器之间是没有继承关系的。所以我们不可以把 Plate 的引用传递给 Plate。**
5151
5252为了让泛型用起来更舒服,Sun 的大脑袋们就想出了` <? extends T> ` 和` <? super T> ` 的办法,来让 “水果盘子” 和“苹果盘子”之间发生关系。
5353
Original file line number Diff line number Diff line change @@ -40,9 +40,9 @@ List<TextView> textViews = buttons;
4040
4141我们知道 ` Button ` 是继承自 ` TextView ` 的,根据 Java 多态的特性,第一处赋值是正确的。
4242
43- 但是到了 ` List<TextView> ` 的时候 IDE 就报错了,这是因为 Java 的泛型本身具有「不可变性 Invariance」,Java 里面认为 ` List<TextView> ` 和 ` List<Button> ` 类型并不一致,也就是说,子类的泛型(` List<Button> ` )不属于泛型(` List<TextView> ` )的子类。
43+ 但是到了 ` List<TextView> ` 的时候 IDE 就报错了,这是因为 ** Java 的泛型本身具有「不可变性 Invariance** 」,Java 里面认为 ` List<TextView> ` 和 ` List<Button> ` 类型并不一致,也就是说,子类的泛型(` List<Button> ` )不属于泛型(` List<TextView> ` )的子类。
4444
45- > Java 的泛型类型会在编译时发生** 类型擦除** ,为了保证类型安全,不允许这样赋值。至于什么是类型擦除,这里就不展开了。
45+ > Java 的泛型类型会在编译时发生** 类型擦除** (==为了兼容老版==本) ,为了保证类型安全,不允许这样赋值。至于什么是类型擦除,这里就不展开了。
4646>
4747> 你可以试一下,在 Java 里用数组做类似的事情,是不会报错的,这是因为数组并没有在编译时擦除类型:
4848>
@@ -92,7 +92,7 @@ Java 中的 ? extends
9292
9393那我干脆不要 `extends TextView ` ,只用通配符 `? ` 呢?
9494
95- 这样使用 `List<?> ` 其实是 `List<? extends Object > ` 的缩写。
95+ ** 这样使用 `List<?> ` 其实是 `List<? extends Object > ` 的缩写。**
9696
9797和前面的例子一样,编译器没法确定 `? ` 的类型,所以这里就只能 `get` 到 `Object ` 对象。
9898
@@ -134,8 +134,8 @@ Java 中的 ? super
134134
135135小结下,Java 的泛型本身是不支持协变和逆变的。
136136
137- * 可以使用泛型通配符 `? extends` 来使泛型支持协变,但是「只能读取不能修改」,这里的修改仅指对泛型集合添加元素,如果是 `remove(int index)` 以及 `clear` 当然是可以的。
138- * 可以使用泛型通配符 `? super ` 来使泛型支持逆变,但是「只能修改不能读取」,这里说的不能读取是指不能按照泛型类型读取,你如果按照 `Object ` 读出来再强转当然也是可以的。
137+ * 可以使用泛型通配符 `? extends` 来使泛型支持协变,但是「** 只能读取不能修改** 」,这里的修改仅指对泛型集合添加元素,如果是 `remove(int index)` 以及 `clear` 当然是可以的。
138+ * 可以使用泛型通配符 `? super ` 来使泛型支持逆变,但是「** 只能修改不能读取** 」,这里说的不能读取是指不能按照泛型类型读取,你如果按照 `Object ` 读出来再强转当然也是可以的。
139139
140140根据前面的说法,这被称为 PECS 法则:「_Producer- Extends , Consumer - Super_ 」。
141141
You can’t perform that action at this time.
0 commit comments