此处的<T>类似于占位符,告诉编译器我返回的是泛型,而不是T类。只有搭配了<T>之后,后面的T才是泛型,而不是某个T.class。
下面介绍<T> T的两种用法。
1.方法参数带T
public class Test {
//这里的泛型受入参类型影响,跟入参类型保持一致
public static <E> List<E> getListFromArray(E[] array) {
List<E> result = new ArrayList<>();
for(E tmp : array){
result.add(tmp);
}
return result;
}
public static void main(String[] args) {
Student[] students = {new Student(1,"张三",123),new Student(2,"李四",123)};
List<Student> listFromArray = getListFromArray(students);
System.out.println(listFromArray);
}
}
结果:
2.方法参数不带T和类后不带<T>(因为这样子即表面泛型不受任何因素影响,则使用方需要什么就转换成什么,使用方不需要强转)
public class Test {
final static HashMap<String,Object> obj = new HashMap<>();
//这里的泛型受接受接收参数影响,即方法会自动转成接收参数对应的类型
//如果无法转换,则报ClassCastException: XX cannot be cast to XX
public static <T> T getObj(String key) {
return (T) obj.get(key);
}
public static void main(String[] args) {
obj.put("student",new Student(1,"张三",123));
obj.put("user",new User("zhansan","abc123"));
Student student = getObj("student");
User user = getObj("user");
System.out.println(student);
System.out.println(user);
}
}
结果