单独的T 代表一个类型 ,而 Class<T>代表这个类型所对应的类, Class<?>表示类型不确定的类
E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的java类型
举例说明:
Set<T> 表示 集合里 是 T类的实例
List<E> 表示 集合里 是 E类的实例
List<?> 表示 集合里的对象类型不确定,未指定
List 同 List<?> 是一样的。
泛型的作用:
1、用泛型:
Java代码
List<T> list=new ArrayList<T>();
T t=list.get(0);
2、不用泛型:
Java代码
List list=new ArrayList();
T t=(T)list.get(0);
自定义泛型接口、泛型类和泛型方法
***泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。
类型通配符
类型通配符一般是使用 ? 代替具体的类型实参。注意了,此处是类型实参,而不是类型形参!且Box<?>在逻辑上是Box<Integer>、Box<Number>...等所有Box<具体类型实参>的父类。由此,我们依然可以定义泛型方法,来完成此类需求。
类型通配符上限通过形如Box<? extends Number>形式定义,相对应的,类型通配符下限为Box<? super Number>形式,其含义与类型通配符上限正好相反.
List<? extends T>
表示该集合中存在的都是类型T的子类,包括T自己List<? super T>
表示该集合中存的都是类型T的父类,包括T自己-
1、A extends B ,则 B 是A 的父类或者祖先
若参数为T<? extends B> 意味着子类是不确定的,因此只能读取数据,而不能插入数据,即get()和set()方法中只能是get有效
2、A super B, 则A是B 的父类或者祖先
若参数为T<? superB> 意味着父类是不确定的,因此只能插入数据,而不能读取数据,即get()和set()方法中只能是set有效