T表示泛型,new的时候要加入泛型,更方便通用
? 表示不确定的类型,一般用在通配
Object表示java中所有类的父类,在集合中使用时要格外注意。
jdk为了便于理解,用K表示键,V表示值,T表示type类型,E表示enum枚举,其实这四个都只是符号,都是表示泛型名称。换成其他字母都没关系,但是都要在之前声明。
下面介绍一个小demo
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
//虽然Test<T1,T2>,但类名字仍为Test。T1,T2只是告诉我们new的时候要加入泛型,更方便通用
//T1,T2可以任意定义,比如改成K,V都可以
//他们不会关联到其他类,只是在本类中通用
public class Test<T1, T2> {
public static void main(String[] args) {
System.out.println(new Test().getT1());
System.out.println(new Test().getT2());
new Test<String, String>().getClassName("");//T1,T2在new的时候用到,这里都为String
new Test().getClassAndList(Integer.class);
//HashMap的括号里面不能是T,E,T1,T2等不确定的东西,但可以是?
HashMap<?, ?> map = new HashMap<Object, String>();
List<?> list = new ArrayList<String>();
}
public T1 getT1() {
//这里的“T1”替换成1或1.0都会报错
return (T1) "T1";
}
public T2 getT2() {
//将自动转型为String
return (T2) "T2";
}
public <T> void getClassName(T x) {
//<T>必须放在void或者返回类型的前面
System.out.println(x.getClass().getName());
}
public <T> Class<?> getClassAndList(Class<?> a) {
//Class<T>前面缺少<T>必须定义,否则将出现编译错误
//T改成其他字母都可以,但一定要声明
// 返回类型和参数中的类型:Class<T>和Class<?>都可以。因为返回的a的类型为Class<T>,Class<?>可以通配
//当两个都是Class<?>,参数中的?自动通配成T
System.out.println(a.getClass().getName());//传入的a是一个类,Class类型
//参数里面的Class<T>最大的好处是如果方法里面定义了泛型,可以自动获取类型值,比如如下的List<T>可以自动获取到a的类型,不必强调死
List<?> b = new ArrayList<T>();
//List<?> b = new ArrayList<?>();会报错,以为ArrayList必须是一种类型,List<>起到通配的作用
//List<T> b = new ArrayList<T>();当然正确
System.out.println(b);
return a;
}
}