如果一个装橘子的列表 L is-a 装水果的列表,则任何是水果的东西都能装进 L,然而 L 不可以装苹果而苹果是水果。
lululau
2021-01-04 19:02:11 +08:00
哪个 Java Generics 的教程不讲这么基本的问题?
Takamine
2021-01-04 19:18:32 +08:00
PECS 。
hantsy
2021-01-04 19:33:38 +08:00
Child 是 Parent 的子类, 可以写 Parent p = new Child()
但是 List<Child> 不是 List<Parent>子类,注意它们的 Type 是 List,而不是参数,就这么简单。
maninfog
2021-01-04 19:37:56 +08:00
关键词 协变 逆变
yuk1no
2021-01-04 19:41:35 +08:00
因为这样写是 invariant 的
misakawaque
2021-01-04 20:28:05 +08:00
因为是看书自学的 外国人语言还是蛮晦涩的,有什么推荐教程么
lidlesseye11
2021-01-04 20:33:26 +08:00
不如先说说如果能的话你想借此实现什么效果呢? 声明了一个<父类>的 list,实际上指向的是个<子类>的 list ?
或者说,假如 arraylist<父类> arlst= new arraylist<子类>() 没问题,那这个 list 的类型限制到底限制了个啥? 接下来 arlst.add(父类)应该报错吗? arlst.add(子类)应该报错吗? arlst.add(另一个子类)应该报错吗?
misakawaque
2021-01-04 20:41:09 +08:00
@lidlesseye11 简单来说就是自己看书产生的疑问 就像一楼的 ArrayList<? extends FatherClass> arlst = new ArrayList<ChildClass>();是成立的 而 arraylist<父类> arlst= new arraylist<子类>();不行 就对他们的区别产生了疑问
autogen
2021-01-04 21:00:42 +08:00
可以这样:
arraylist<父类> arr = new arraylist<>(); arr.add(子类);
leoleoasd
2021-01-04 21:19:37 +08:00
Java 中泛型是不变的,可有时需要实现逆变与协变,怎么办呢?这时,通配符?派上了用场:
<? extends>实现了泛型的协变,比如: List<? extends Number> list = new ArrayList<Integer>(); <? super>实现了泛型的逆变,比如: List<? super Number> list = new ArrayList<Object>();