
1 johnkiller 2021 年 1 月 4 日 ArrayList<? extends FatherClass> arlst = new ArrayList<ChildClass>(); |
2 geelaw 2021 年 1 月 4 日 via iPhone 因为范型参数 T 既要传入又要传出,因此是不变的。 一个装橘子的列表有两个性质:取出来的东西都是橘子;是橘子的都能放进去。 一个装水果的列表也有类似的两个性质。 如果一个装橘子的列表 L is-a 装水果的列表,则任何是水果的东西都能装进 L,然而 L 不可以装苹果而苹果是水果。 |
3 lululau 2021 年 1 月 4 日 via iPhone 哪个 Java Generics 的教程不讲这么基本的问题? |
4 Takamine 2021 年 1 月 4 日 via Android PECS 。 |
5 hantsy 2021 年 1 月 4 日 Child 是 Parent 的子类, 可以写 Parent p = new Child() 但是 List<Child> 不是 List<Parent>子类,注意它们的 Type 是 List,而不是参数,就这么简单。 |
6 maninfog 2021 年 1 月 4 日 via iPhone 关键词 协变 逆变 |
7 yuk1no 2021 年 1 月 4 日 via iPhone 因为这样写是 invariant 的 |
8 misakawaque OP 因为是看书自学的 外国人语言还是蛮晦涩的,有什么推荐教程么 |
9 lidlesseye11 2021 年 1 月 4 日 不如先说说如果能的话你想借此实现什么效果呢? 声明了一个<父类>的 list,实际上指向的是个<子类>的 list ? 或者说,假如 arraylist<父类> arlst= new arraylist<子类>() 没问题,那这个 list 的类型限制到底限制了个啥? 接下来 arlst.add(父类)应该报错吗? arlst.add(子类)应该报错吗? arlst.add(另一个子类)应该报错吗? |
10 misakawaque OP @lidlesseye11 简单来说就是自己看书产生的疑问 就像一楼的 ArrayList<? extends FatherClass> arlst = new ArrayList<ChildClass>();是成立的 而 arraylist<父类> arlst= new arraylist<子类>();不行 就对他们的区别产生了疑问 |
11 autogen 2021 年 1 月 4 日 可以这样: arraylist<父类> arr = new arraylist<>(); arr.add(子类); |
12 leoleoasd 2021 年 1 月 4 日 Java 中泛型是不变的,可有时需要实现逆变与协变,怎么办呢?这时,通配符?派上了用场: <? extends>实现了泛型的协变,比如: List<? extends Number> list = new ArrayList<Integer>(); <? super>实现了泛型的逆变,比如: List<? super Number> list = new ArrayList<Object>(); 摘自 https://www.cnblogs.com/en-heng/p/5041124.html |
13 qwerthhusn 2021 年 1 月 4 日 来个? extends XXX 或者? super XXX 就行了 Java 泛型语法复杂点的及其羞涩难懂,知道个大概就行了,后面用的时候慢慢就熟悉了 |
14 mxalbert1996 2021 年 1 月 4 日 via Android |
15 kx5d62Jn1J9MjoXP 2021 年 1 月 4 日 List<鸡> chicks = new ArrayList<>(); List<鸟> birds = chicks; birds.add(new 鸭()); 鸡 c = chicks.get(0); |
16 no1xsyzy 2021 年 1 月 5 日 范畴论( Category Theory )中的 协变 与 逆变 吐槽下:面向对象的数学原理就是范畴论,但目前没有任何一门语言完全按照范畴论来设计面向对象架构,因为一个核心就是只能有 obj = obj.metaphor(field=new_value) ,不能有 obj.field=new_value,那就很不直观了。 剩下的 #2 讲得挺清楚的。 |
17 az467 2021 年 1 月 5 日 1.因为 Java 类型构造器是不变的。 2.ArrayList 是 mutable 的容器类,这么做符合里氏替换原则。 3.就算你想让它协变逆变双变都不行,Java 不支持,换语言吧。 |
19 PoetAndPoem 2021 年 1 月 5 日 @mxalbert1996 谢谢, 好久没看 effective java 了== |