简介
什么是泛型类?
泛型变量,在函数定义时声明。
示例:基础示例
package com.example;
import java.util.ArrayList;
import java.util.List;
public class TestGeneric {
// 泛型函数
private static <T> T getFirst(List<T> dataList) {
if (dataList == null || dataList.size() == 0) {
return null;
}
return dataList.get(0);
}
// main 入口
public static void main(String[] args) {
List<Long> numList = new ArrayList<>();
numList.add(123L);
numList.add(456L);
Long first = getFirst(numList);
System.out.println(first);
}
}
执行结果:
123
示例:限制泛型变量的实际类型
比如限制必须是 Number 类或者其子类:
package com.example;
import java.util.ArrayList;
import java.util.List;
public class TestGeneric {
// 泛型函数
private static <T extends Number> T getFirst(List<T> dataList) {
if (dataList == null || dataList.size() == 0) {
return null;
}
return dataList.get(0);
}
// main 入口
public static void main(String[] args) {
List<Long> numList = new ArrayList<>();
numList.add(123L);
numList.add(456L);
Long first = getFirst(numList);
System.out.println(first); // 输出 123
// 下面这个会编译报错
getFirst(new ArrayList<String>());
}
}
示例:将泛型类型对应的实际 Class 作为参数传入泛型函数
代码:
package com.example;
import java.util.ArrayList;
import java.util.List;
public class TestGeneric {
// 泛型函数
private static <T> T getFirst(List<T> dataList, Class<T> cls) {
if (dataList == null || dataList.size() == 0) {
return null;
}
System.out.println("泛型类型的实际类型是: " + cls.getCanonicalName());
return dataList.get(0);
}
// main 入口
public static void main(String[] args) {
List<Long> numList = new ArrayList<>();
numList.add(123L);
numList.add(456L);
Long first = getFirst(numList, Long.class);
System.out.println(first);
}
}
执行结果:
泛型类型的实际类型是: java.lang.Long
123
注意,因为 numList 类型是 List<Long>
,所以 getFirst 的第2个参数必须是 Long.class
。若是 Integer.class
等其他值,会报错。