使用大写字母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;
}