【Java学习笔记】38:三种泛型通配符

xiaoxiao2021-02-28  101

无界型(匹配所有类) 以遍历存某个类参数化的Collection集合(实现为很多泛型类)的对象为例,这里是遍历实际参数为Animal的集合:

package day38; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; //动物 class Animal{ @Override public String toString() { return "Animal"; } } //宠物属于动物 class Pet extends Animal{ @Override public String toString() { return "Pet"; } } //狗属于宠物 class Dog extends Pet{ @Override public String toString() { return "Dog"; } } public class Test { public static void main(String[] args) { List<Animal> l1=new ArrayList<Animal>(); l1.add(new Animal()); l1.add(new Animal()); loop(l1); // List<Pet> l2=new ArrayList<Pet>(); // l2.add(new Pet()); // l2.add(new Pet()); // loop(l2); } public static void loop(Collection<Animal> c){ Iterator<Animal> k=c.iterator(); while(k.hasNext()) { System.out.println(k.next()); } } }

因为loop()指定了形参是用Animal参数化的Collection类型的c,而l2虽然也继承了Collection接口,但是是用Pet实例化的,所以注释的部分使用会出错: 这时候就可以使用通配符了,让loop()的形参变成允许更多引用类参数化的Collection类型,如变成所有引用类型参数化的Collection类型:

public static void loop(Collection<?> c){ Iterator<?> k=c.iterator(); while(k.hasNext()) { System.out.println(k.next()); } }

这时候注释部分也可以使用了,这里的”?”即是一种通配符,表示匹配所有的类。

上确型(匹配某类及其子类) 假如想匹配Animal类及其子类,其它类不匹配:

public static void loop(Collection<? extends Animal> c){ Iterator<?> k=c.iterator(); while(k.hasNext()) { System.out.println(k.next()); } }

可以看到只有Student类不行,因为它没有直接或间接地继承Animal:

下确型(匹配某类及其超类) 假如想匹配Dog类及其超类,其它类不匹配:

public static void loop(Collection<? super Dog> c){ Iterator<?> k=c.iterator(); while(k.hasNext()) { System.out.println(k.next()); } }

可以看到只有Student类不行,因为它没有直接或间接地作为Dog的超类:

转载请注明原文地址: https://www.6miu.com/read-18899.html

最新回复(0)