三句话总结JAVA泛型通配符(PECS),在JAVA的泛型集合中,默认都可以添加null,除此以外,还有以下三条规则。
以“?”声明的集合,不能往此集合中添加元素,所以它只能作为生产者(亦即它只能被迭代),如下:
List names = Lists.newArrayList("yiifaa"); // 通配符声明的集合,获取的元素都是Object类型 List
以“? extends T”声明的集合,不能往此集合中添加元素,所以它也只能作为生产者,如下:
List names = Lists.newArrayList("yiifaa"); // 声明消费者 ListallNames = Lists.newArrayList("yiifee"); // 消费生产者的元素 allNames.addAll(allNames);
相对于以“?”声明的集合,“? extends T”能更轻松地迭代元素:
List names = Lists.newArrayList("yiifaa"); // 能更精确地确认元素类型 for(String name: names) { System.out.println(name); }
在通配符的表达式中,只有“? super T”能添加元素,所以它能作为消费者(消费其他通配符集合)。
List allNames = Lists.newArrayList("yiifaa"); // Listnames = Lists.newArrayList("yiifee"); // 可以直接添加泛型元素 allNames.addAll(names); // 也可以添加通配符泛型元素 List names1 = Lists.newArrayList("yiifee"); allNames.addAll(names1);
针对采用“? super T”通配符的集合,对其遍历时需要多一次转型,如下:
// 只能获取到Object类型 for(Object name: allNames) { // 这里需要一次转型 System.out.println(name); }
JAVA泛型通配符的使用规则就是赫赫有名的“PECS”(生产者使用“? extends T”通配符,消费者使用“? super T”通配符)。