泛型学习__记一次泛型方法提取.

前言:

泛型怎么学习?有什么好方法?我这里没有!我学泛型的方法就是用起来.看到自己代码里有重复的方法...,那就想办法提取.多写多尝试.

泛型的知识点这个博文https://blog.csdn.net/s10461/article/details/53941091写得不错,直接上例子:

一同学里发来一份代码,说有好几个方法都是重复的,能不能帮忙反射提取一下.代码如下:

public class Tool {  public static Map<String, User> mapD = new HashMap<String, User>();// 用户  public static Map<String, OtherMachine> mapT = new HashMap<String, OtherMachine>();// 设备  public static Map<String, Factory> mapF = new HashMap<String, Factory>();  public static Map<String, Product> mapP = new HashMap<String, Product>();//  一,遍历用户链表  public static Vector<Vector<String>> iterator() throws IOException {    Vector<Vector<String>> s = new Vector<Vector<String>>();    Iterator<Entry<String, User>> it = mapD.entrySet().iterator();    while (it.hasNext()) {      Entry<String, User> entry = it.next();      Vector<String> v = new Vector<String>();      v.add(entry.getValue().getID());      v.add(entry.getValue().getName());      v.add(entry.getValue().getNumber());      v.add(entry.getValue().getPower());      s.add(v);    }    return s;  }  // 二,遍历产品链表  public static Vector<Vector<String>> iteratorP() throws IOException {    Vector<Vector<String>> s = new Vector<Vector<String>>();    Iterator<Entry<String, Product>> it = mapP.entrySet().iterator();    while (it.hasNext()) {      Entry<String, Product> entry = it.next();      Vector<String> v = new Vector<String>();      v.add(entry.getValue().getName());      v.add(entry.getValue().getSize());      v.add(entry.getValue().getType());      v.add(entry.getValue().getDescription());      s.add(v);    }    return s;  }  //三 遍历设备链表  //四遍历工厂链表  }

既然指明要用反射,那就先来一版反射的.

  public static <T> List<List<String>> iterator3(Map<String, T> map, Class<T> clazz) throws Exception {    List<List<String>> outerlist = new ArrayList<>();    Iterator<Entry<String, T>> it = map.entrySet().iterator();    Method[] methods = clazz.getMethods();    while (it.hasNext()) {      List<String> inerlist = new ArrayList<>();      Entry<String, T> entry = it.next();      T t = entry.getValue();      for (Method method : methods) {        String name = method.getName();        if (name.startsWith("get") && !name.equals("getClass")) {          Object invoke = method.invoke(t);          if (invoke != null) {            inerlist.add(invoke.toString());          }}}      outerlist.add(inerlist);    }    return outerlist;  }

反射提取完了之后发现有个问题,即获取的参数的顺序跟原来的方法不一致,想了好久,也没找到更好的办法.

 

那就换个思路,不使用反射,通过重写toString方法来实现所需要的的格式.

  public static <T> List<List<String>> iterator2(Map<String, T> map, Class<T> clazz) throws Exception {    List<List<String>> outerlist = new ArrayList<>();    Iterator<Entry<String, T>> it = map.entrySet().iterator();    while (it.hasNext()) {      List<String> inerlist = new ArrayList<>();      Entry<String, T> entry = it.next();      T t = entry.getValue();      inerlist.add(t.toString());      outerlist.add(inerlist);    }    return outerlist;  }  //User类的toString格式如下.  @Override  public String toString() {    return ID + "," + name + "," + number + "," + power;  }

运行后发现符合要求.交差收工.

 

#欢迎关注-- ☆帮助各位同学辅导java相关问题☆.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值