泛型使用

使用大写字母A,B,C,D......X,Y,Z定义的,就都是泛型,把T换成A也一样,这里T只是名字上的意义而已

  • 表示不确定的java类型
  • T (type) 表示具体的一个java类型
  • K V (key value) 分别代表java键值中的Key Value
  • E (element) 代表Element

一、List<T>,List<?>,T,Class<?>区别(看完例子再看区别吧)

1:List<T>和List<?>和T :  都可以代表传入类型或者返回值。

2:如果入参是List<T>,此时该方法必须以<T>修饰的泛型方式返回

3:方法中不能同时2个入参都是T类型(除非两个入参的类型一致),其他类型的参数以通配符表示。

4:如果方法返回是List<?>,那么入参只能是 ? 类型。

5:Class<T> 和 Class<?> :Class<T>作为入参写入,返回值也是T类型。 Class<?> 反射的时候对应任何类型。

 

二、 List<T>,List<?>,T,Class<T> 使用场景:

A: 联合2个List, 返回值必须是T类型 :

public static <T> ArrayList<T> union(List<T> list1, List<T> list2) {
        ArrayList result = null;
        if(list1 == null) {
            result = new ArrayList();
        } else {
            result = new ArrayList(list1);
        }

        if(list2 != null) {
            result.addAll(list2);
        }

        return result;
    }

B:对List切割成多个list[] 

public static <T> List<T>[] split(List<T> source, int groupSize) {
        if(CollectionUtils.isEmpty(source)) {
            return null;
        } else {
            int size = source.size();
            groupSize = groupSize < 1?1:groupSize;
            groupSize = groupSize > size?size:groupSize;
            List[] listArr = new List[groupSize];
            int sizeOfGroup = size / groupSize;
            int groupNum = -1;
            ArrayList temp = null;

            for(int i = 0; i < size; ++i) {
                if(groupNum + 1 < groupSize && i % sizeOfGroup == 0) {
                    ++groupNum;
                    temp = new ArrayList();
                    listArr[groupNum] = temp;
                }

                temp.add(source.get(i));
            }

            return (List[])listArr;
        }
    }

 

C:转换场景:传入A类返回B类(常用) -- 两个List之间相同属性之间自动赋值 。

public static <T> List<T> copyListElementProperties(List<?> source, Class<T> clazz) {
        if(!CollectionUtils.isEmpty(source) && clazz != null) {
            ArrayList temp = new ArrayList();
            Object t = null;

            try {
                Iterator var4 = source.iterator();

                while(var4.hasNext()) {
                    Object obj = var4.next();
                    t = clazz.newInstance();
                    BeanUtils.copyProperties(obj, t);
                    temp.add(t);
                }
            } catch (Exception var6) {
                ;
            }

            return temp;
        } else {
            return null;
        }
    }

 

三:Class<?> 使用场景:

public static String toString(Object obj) {
        String result = null;
        if (obj == null) {
            return result;
        }

        Class<?> c = obj.getClass();
        if (c == String.class) {
            result = obj.toString();
        } else if (c == BigDecimal.class || c == Integer.class || c == Long.class || c == Double.class || c == Float.class) {
            result = obj.toString();
        } else if (c == Date.class) {
            result = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) obj);
        } else {
            result = toJSONString(obj);
        }

        return result;
    }

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值