码迷,mamicode.com
首页 > 其他好文 > 详细

泛型通配符规则

时间:2018-04-11 00:21:14      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:支持   man   规则   lis   变量   泛型   通配符   extend   返回   

1. 为什么使用通配符

  通配符的使用可以对泛型参数做出某些限制,使代码更安全。我们知道数组是可以协变的,当涉及到泛型时,尽管B是A的子类型,但是 ArrayList<B> 不是 ArrayList<A> 的子类型,二者没有关系,泛型不支持协变,这个时候就要需要通配符来解决这个问题。

2. 使用规则

  (1) “?”不能添加元素

      当“?”为类型变量的,不能往集合中添加元素,甚至不能用Object调用,Pair<?>和Pair本质的不同在于:可以用任意Object对象调用原始Pair类的setObject方法。

  (2)  "?" extends T不能添加元素

      因为编译器只需要知道某个Employee的子类型,但是不知道是什么类型,所以拒绝任何特定类型。但是可以返回子类型限定的对象。

1         Pair<Manager> managerPair = new Pair<>(ceo, cfo);
2         Pair<? extends Employee> employeePair = managerPair;
3         //employeePair.setFirst(coo); //不可调用setFirst方法,因为编译器只需要知道某个Employee的子类型,但是不知道是什么类型,所以拒绝任何特定类型
4         Employee e = employeePair.getFirst();  //合法

 

  (3)  “? super T”能添加元素,也能返回对象类型,但只能赋值给Object类

1         Pair<Employee> employeePair = new Pair<>(idiot, idiot1);
2         Pair<? super Manager> managerPair = employeePair;
3         Object obj = managerPair.getFirst();  //不能保证返回对象的类型,所以只能赋值给Object类
4         managerPair.setFirst(ceo);  //可以为方法提供参数,但只能提供超类型限定的对象

 

3. 总结

  带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象获取

  

泛型通配符规则

标签:支持   man   规则   lis   变量   泛型   通配符   extend   返回   

原文地址:https://www.cnblogs.com/chenloveslife/p/8783264.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!