java泛型边界_Java泛型中的上下边界的理解

用 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值