E - 元素,主要由Java集合(Collections)框架使用。
K - 键,主要用于表示映射中的键的参数类型。
V - 值,主要用于表示映射中的值的参数类型。
N - 数字,主要用于表示数字。
T - 类型,主要用于表示第一类通用型参数。
S - 类型,主要用于表示第二类通用类型参数。
U - 类型,主要用于表示第三类通用类型参数。
V - 类型,主要用于表示第四个通用类型参数。
1、类泛型
package eoa;
public class Box<T> {
private T name;
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
}
2、方法泛型
package eoa;
public class MethodGeneric {
public static <T> void query(T[] criteria) {
}
}
3、多边界以及继承泛型:
package eoa;
public class MutiGeneric {
public static <T extends Number & Comparable<T>> T max(T a, T b, T c) {
T max = a;
if (b.compareTo(a) > 0) {
max = b;
}
if (c.compareTo(b) > 0) {
max = c;
}
return max;
}
}
4、上限通配符
public static void ite(List<? extends Number> arr) {
for (Number n : arr) {
System.err.println(n);
}
}
5、无界通配符
public static void noBord(List<?> list){
for(Object o:list){
System.err.println(o);
}
}
6、下限通配符 只允许当前父类的实例以及当前类的实例加入,而不允许有其他
public static void border(List<? super Integer> list){
for(Object o:list){
System.err.println(o);
}
}
7、泛型参数不能用于方法中实例化:
T item = new T();
如果需要实例化,请采用如下方式:
public <T> T getEntity(Class<T> clazz) throws InstantiationException, IllegalAccessException{
T t=clazz.newInstance();
return t;
}
8、泛型参数无法使用于静态变量,因为静态变量可以在不同实例中共享。如
private static T a;
9、不同参数化类型直接不能互转
package eoa;
public class Generic<T> {
public Generic(T name){
this.name=name;
}
private T name;
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
public static void main(String args[]) {
Generic<Integer> g1=new Generic<Integer>(12);
Generic<Double> g2=new Generic<Double>(12.1);
g1=g2;//抛出异常
}
}
10、不能使用instanceOf,因为编译器采用类型擦除原则(将泛型参数用Object或者限定参数替换),所以无法使用
Generic<Integer> g1=new Generic<Integer>(12);
if(g1 instanceof Generic<Integer> ){//出错
}
11、不能声明泛型数组
Box<Integer>[] bs = new Box<Integer>[2];
因为使用类型擦除,类型参数被转为Object或对应的下界或上界类型,所以在运行时,会抛出ArrayStoreException
12、泛型不能重载
package eoa;
import java.util.List;
class GenericBox {
//Compiler error
//Erasure of method print(List<String>)
//is the same as another method in type Box
public void print(List<String> firstMethod) { }
public void print(List<Integer> secMethod) { }
}