用 extends 父类型>标识上边界通配符,用于表示实例化时可以确定父类型的未知类型
用 super 子类型>标识下边界通配符,用于表示实例化时可以确定子类型的未知类型
例子
public class JavaPromgramer extends Promgramer
public class Promgramer extends ITWorker
public class ITWorker extends Worker
public class Worker extends Person
public class PersonContainer{
private T t;
public void setT(T t) {
this.t = t;
}
public T getT() {
return t;
}
}
//泛型上届限定
PersonContainer extends Worker> container1 = new PersonContainer<>();
// 对于set方法,传入参数可以肯定的是类型是Worker的子类,
// 具体是哪一个子类不确定,在存入的时候可能会把参数向Worker的
// 子类向下转型存在安全隐患所以jvm会报编译错误
// container1.setT(new Person());
// container1.setT(new Worker());
// container1.setT(new Promgramer());
// 对于get方法,保存的数据类型肯定是Worker的子类,
// 当取出来时也肯定是Worker的子类,此时用Worker或它的父类去接收是可以的,
// 因为子类向上转型成父类是隐式的
Worker t = container1.getT();
//泛型下届限定
PersonContainer super Promgramer> container2 = new PersonContainer<>();
// 对于set方法,可以肯定的是保存的参数的类型是Promgramer的父类,
// 如果我存入的是Promgramer或它的子类的话,然后jvm自动向上转型成Promgramer或它的父类
// 是没有任何问题的,我也不需要关心具体是哪个父类。
// 如果存入的是Promgramer的父类的话就和上边界的set方法一样了。
// container2.setT(new Person()); //报错
container2.setT(new Promgramer());
container2.setT(new JavaPromgramer());
// 对于get方法,传入的参数可以肯定的是类型是Promgramer的父类,
// 具体是哪一个父类jvm不知道,但可以肯定的是,Object是所有java类的父类
// 所以取出数据时用Object去接收是可以的,其它的就不行。
Object t1 = container2.getT();
与>的区别
:泛型标识符,用于泛型定义(类、接口、方法等)时,可以想象成形参。
>:通配符,用于泛型实例化时,可以想象成实参。
文章来源: www.oschina.net,作者:触电猖狂,版权归原作者所有,如需转载,请联系作者。
原文链接:https://my.oschina.net/u/3437323/blog/3145635