<? extends T>允许调用读方法T get()获取T的引用,但不允许调用写方法set(T)传入T的引用(传入null除外);
<? super T>允许调用写方法set(T)传入T的引用,但不允许调用读方法T get()获取T的引用(获取Object除外)。
一个是允许读不允许写,另一个是允许写不允许读。
不能是基本类型,例如:int;
不能获取带泛型类型的Class,例如:Pair<String>.class;
不能判断带泛型类型的类型,例如:x instanceof Pair<String>;
不能实例化T类型,例如:new T()。
泛型方法要防止重复定义方法,例如:public boolean equals(T obj);
子类可以获取父类的泛型类型<T>。
{/collapse-item}
{collapse-item label="extends通配符"}
Pair<Number> p1=new Pair<>(12.3,4.56);
int n=setsa(p2);//读取
System.out.println(n);
//extends通配符 允许读不允许写
static int setsa(Pair<? extends Number> p){
Number fi=p.getFirst();
Number la=p.getLast();
return p.getFirst().intValue()+p.getFirst().intValue();
}
class Pair<T> {
private T first;
private T last;
public Pair(T first, T last) {
this.first = first;
this.last = last;}
public T getFirst() {return first;}
public T getLast() {return last;}
public void setFirst(T first) {this.first = first;}
public void setLast(T last) {this.last = last;}
}
{/collapse-item}
{collapse-item label="super通配符"}
//super通配符
// 注意到Pair<? super Integer>表示,
//Pair<?>是所有Pair<T>的超类
// 方法参数接受所有泛型类型为Integer或Integer父类的Pair类型。
Pair<Number> p1=new Pair<>(12.3,4.56);
Pair<Integer> p2=new Pair<>(123,456);
setSame(p1,456);
setSame(p2,123);//写入
Pair<?>p3=p1;//安全地向上转型
System.out.println(p3.getFirst()+","+p3.getLast());
System.out.println(p1.getFirst()+" "+p1.getLast());
System.out.println(p2.getFirst()+" "+p2.getLast());
//super通配符 允许写不允许读。
static void setSame(Pair<? super Integer> p, Integer n) {
p.setFirst(n);
p.setLast(n);
}
class Pair<T> {
private T first;
private T last;
public Pair(T first, T last) {
this.first = first;
this.last = last;}
public T getFirst() {return first;}
public T getLast() {return last;}
public void setFirst(T first) {this.first = first;}
public void setLast(T last) {this.last = last;}
}
{/collapse-item}
{collapse-item label="super跟extends运用"}
copy()方法内部不会读取dest,因为不能调用dest.get()来获取T的引用;
copy()方法内部也不会修改src,因为不能调用src.add(T)。
// 把src的每个元素复制到dest中:
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
for (int i=0; i<src.size(); i++) {
T t = src.get(i);
dest.add(t);
}
}
{/collapse-item}
{collapse-item label="其他"}
{message type="info" content="
//Pair<?>是所有Pair<T>的超类
void sample(Pair<?> p) {
}
因为<?>通配符既没有extends,也没有super,因此:
不允许调用set(T)方法并传入引用(null除外);
不允许调用T get()方法并获取T引用(只能获取Object引用)。
换句话说,既不能读,也不能写,那只能做一些null判断:"/}
{/collapse-item}
本文共 742 个字数,平均阅读时长 ≈ 2分钟
评论