java泛型向下限定,一图看懂Java泛型通配符

bV4e7X?w=518&h=397

当使用 super MyClass> 的时候,表明未知类的继承结构处于 Object 和 MyClass 之间,这时

编译器只能确定任何返回该未知类型的方法,返回的变量都是 Object 的子类,所以返回的类型就确定为 Object,比如 getter 方法

使用该未知类型作为参数的方法,该参数一定是 MyClass 的父类,所以可以传递 MyClass 及其子类进去,比如 setter 方法

而使用 extends MyClass> 的时候,未知类型一定是 MyClass 的子类,但向下延伸到无穷尽,无法判断

所以返回未知类型的方法的返回类型有一个上界,就是 MyClass,即返回类型确定为 MyClass

但是使用未知类型的方法,因为向下继承无限延伸,无法判断下界,所以不能使用该方法,比如 setter(可以 set(null))

使用 > 的时候,可以当作 extends Object>,即上界是 Object,可以使用 getter 方法,不可以使用 setter 方法。

根据上面这些原则,一个简单的例子如下:

@Data // lombok,省略了 getter 和 setter

class Holder{

private T t;

public void testSetter(Holder super MyClass> holder, U u) {

holder.setT(u); // 可以输入任何 MyClass 及子类的对象

holder.setT(null);

}

public void testGetter1(Holder extends MyClass> holder) {

MyClass obj = holder.getT(); // 能确定返回的对象一定是 MyClass 或父类的对象

}

public void testGetter2(Holder> holder) {

Object obj = holder.getT(); // 只能确定返回的对象一定是 Object

}

}

class MyClass{}

选择限定通配符时的快速判断方法:

get-put principle:

Use an extends wildcard when you only get values out of a structure, use a super wildcard when you only put values into a structure, and don't use a wildcard when you do both.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值