Java通用通配符下界:列表<!-?超级父级->列表=新的ArrayList <>()

时间:2018-09-10 05:35:54

标签: java generics wildcard

为什么起作用? 我了解“超级父亲”只允许父亲和祖父

How to disable status bar click and pull down in Android?

此处的代码-------------------

公共类RxTest {

public static void main(String[] args) {


    // extends -> read only
    // super -> write only

    List<? super Father> list = new ArrayList<>();

    list.add(new Child());
    list.add(new Child());

    System.out.println(list.size()); // 2

    // why does it work? I understood taht "? super Father" only allows Father and GrandFather


}

}

祖父级{ }

父级继承祖父{ }

班级子女扩展父亲{ }

1 个答案:

答案 0 :(得分:1)

不要读“ ? super Father”,因为“一切都是Father的超类型。”

将其读取为“ 此列表中元素的预期类型Father的超类型”。这似乎是我在说同一件事,但事实并非如此。

是说创建 actual 列表的事物(不是通配引用)期望列表中的所有事物都是特定类型,并且该类型是{{1}的超类型}。您无法创建Father,它必须是new ArrayList<? super/extends Something>

这样,您可以添加new ArrayList<Something>的实例(其中包括Father之类的子类型),而不会违反对列表中元素的期望。

记住PECS

  

生产者扩展,超级消费者

ChildList<? super Father>实例的消费者

与代码中的“ Father”相同,。您仍然可以从下限列表中读取内容,只需将所有内容都视为super -> write only

类似地,Object并不意味着“只读”:您可以将列表中的现有元素添加到自身中,也可以添加文字extends