前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >泛型方法

泛型方法

作者头像
java达人
发布2018-01-31 18:07:07
1.2K0
发布2018-01-31 18:07:07
举报
文章被收录于专栏:java达人java达人

上一篇章我们出于类型安全的考虑,不建议使用原生类型,用List<?>代替使用,但是List<?>不允许添加除null以外的任何元素,因此我们需要使用泛型方法List<E>,如下:

代码语言:js
复制
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class KnowGeneric {
 /*
  * 不允许添加除null以外的任何元素 The method addAll(Collection<? extends capture#1-of ?>) in
  * the type List<capture#1-of ?> is not applicable for the arguments
  * (List<capture#2-of ?>)
  */
 private static <E> List<?> wildCardAdd(List<?> list1, List<?> list2) {
 for (int i = 0; i < list2.size(); i++) {
 //判断过滤代码略
 list1.add(list2.get(i));
  }
 }
 private static <E> void geneAdd(List<E> list1, List<E> list2) {
 for (E e : list2) {
 //判断过滤代码略
 list1.add(e);
  }
 }
 /*

* 根据"producer-extends, consumer-super"法则

若从集合中获取数据,则该集合元素类型使用 ? extends E通配符

若往集合中插入数据,则使用 ? super E通配符

同时用于存取,不用通配符。

如下方法则选择一个参数使用通配符,保证list1可以兼容list2元素类型即可

你可以尝试下把list1类型改成List<? extends E>,不会编译通过,因为此时list1元素类型被指定为E的子类,我们不能确定子类是什么,是否与list2中的元素类型兼容。

代码语言:js
复制
   */
 private static <E> void boundedWildCardAdd(List<E> list1, List<? extends E> list2){
 for (E e : list2) {
 //判断过滤代码略
 list1.add(e);
  }
  System.out.println(list1.toString());
 }
 public static void main(String[] args) {
  List<Integer> inteList1 = new ArrayList<Integer>(Arrays.asList(11,22,33));
  List<Integer> inteList2 = new ArrayList<Integer>(Arrays.asList(44,55,66));
  List<Number> numList = new ArrayList<Number>(Arrays.asList(88,99,100));
 // 类型一致,没有错误和警告
 geneAdd(inteList1, inteList2);
 /*
   * List<Integer> 并不是List<Number>的子类
   * 编译错误:The method geneAdd(List<E>, List<E>) in the type KnowGeneric is not
   * applicable for the arguments (List<Number>, List<Integer>)
   */
 geneAdd(numList, inteList2);
 //编译通过
 boundedWildCardAdd(inteList1, inteList2);
 boundedWildCardAdd(numList, inteList2);
 }
}

geneAdd指定类型参数E,保证集合中数据类型一致,但geneAdd方法有个不足之处,那就是缺乏灵活性,两个方法参数E的类型都必须是一样的,我们可以用有界通配符,boundedWildCardAdd就是其中一个示例,根据"producer-extends, consumer-super"法则,你可以将类型参数改用super的形式表示,看看运行结果如何

代码语言:js
复制
 private static <E> void boundedWildCardAdd(List<? super E> list1, List<E> list2){

 for (E e : list2) {
 //判断过滤代码略
 list1.add(e);
  }
  System.out.println(list1.toString());
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档