https://www.journaldev.com/1663/java-generics-example-method-class-interface#generics-java

A generic type is a class or interface that is parameterized over types
泛型类、接口,核心在于“类型参数化”

核心点说三遍
类型参数化
类型参数化
类型参数化
**

泛型类

TestClass 如以上,T用来取代Object,
同时在实例化该类时如果 不传,则视为 TestClass
如声明时TestClass 则传入的类型为String

泛型方法

如果不想对整个类的某类型进行参数化,这个时候就可以用方法泛型,将泛型控制在方法局部。
public static T isEqual(GenericsType g1, GenericsType g2){
T t = null;
return t;
}
在返回参数前声明,即方法内用到T的地方,都是参数化类。
在调用方法时可以在方法前指定泛型的类型

GenericsMethods.isEqual(g1, g2);

同样的如果不指定类型,类型做Object处理

有界限的泛型

public static > int compare(T t1, T t2){
return t1.compareTo(t2);
}
如上,限定类型,此时调用方法时参数类型被限定,即不会再有做Object处理一说,编译期间就会做控制

泛型的继承与父子关系

interface MyList extends List{ }
MyList的会传导给List的
MyList 时 List的子类型
但是MyList 不是 List 的子类型

如,加入泛型后,判断父子类同时需要考虑泛型内的参数一致,注意是一致,泛型内参数是父子关系不可。
List list =null;
ArrayList aList = null;
list = aList;

通配符

如下,限定list只能是Number类型的,Number的子类Integer、Double 是不允许传的

public static double sum(List list){
double sum = 0;
for(Number n : list){
sum += n.doubleValue();
}
return sum;
}

有界泛型

上界列表
**
扩大其限制类型, 将允许所有继承自Number的类型
public static double sum(List<? extends Number> list){
double sum = 0;
for(Number n : list){
sum += n.doubleValue();
}
return sum;
}

注意:sum方法不能往list中添加任何元素,除非是null

无界列表
public static void printData(List<?> list){
for(Object obj : list){
System.out.print(obj + “::”);
}
list.add(null);
}
代表可以传任何的list进来
同样的list不能添加任何元素,除非是null,利用这一点可以避免传入的list被添加内容

下界列表
**
如下,如果希望传入的泛型,必须是用来处理整数的,则限定为必须是Integer获其父类,Number、Object都可以处理整数

public static void addIntegers(List<? super Integer> list){
list.add(new Integer(50));
}
这种情况下list可以添加内容,因为Integer 一定是泛型传入的类型本类获子类