Java中泛型通配符 <?>

Java中的泛型通配符分三类

  • <?>:这个代表可以使任意类型
  • <? extends ClassName>:这个代表是继承于ClassName或者是ClassName本身的类,在有些文章中也叫做 上界通配符
  • <? super ClassName>:这个表示是ClassName类或者是ClassName的父类,在有些文章中也叫做 下界通配符

注意:在这里的这个ClassName没有实际意义只是作为示例的一个类名

 看一个例子,现在有这么一个函数和这么一段继承关系

public void  printClassName(ArrayList<? extends A> list){}
class A {}
class B extends A{}
class C extends B{}

? 通配符

现在往printClassName函数中添加一个泛型通配符,现在变成了这样

public void  printClassName(ArrayList<?> list){}

这样意味着我们可以在调用的时候,书写任意的类型,被这个ArrayList所管理

printClassName(new ArrayList<Object>());
printClassName(new ArrayList<Integer>());
printClassName(new ArrayList<Boolean>());

<? extends ClassName> 通配符

我们把原函数改成这样

public void printClassName(ArrayList<? extends A> list){}

 这样我们意味着调用printClassName函数的时候只能传递A本身或者继承A的类

当我们使用new ArrayList<? extends Object>() 作为printClassName的参数的时候我们会得到一个错误

printClassName(new ArrayList<Object>());

Required type:   ArrayList <? extends A>
Provided: ArrayList <Object> 

这意味着我们泛型指定的类型不满足 ? extends A了,因为Object并不是A或者是继承A的类

 但是这样都是被允许的

printClassName(new ArrayList<A>());
printClassName(new ArrayList<B>());
printClassName(new ArrayList<C>());

<? super ClassName>通配符

public void printClassName(ArrayList<? super A> list){}

这样我们意味着调用printClassName函数的时候只能传递A本身或者A的父类,像这样

printClassName(new ArrayList<A>());
printClassName(new ArrayList<Object>());

三种通配符之间的关系 

注意红色和紫色线条和方块之间的联系,中间灰色部分为紫色和红色线的交集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值