- 类型变量(T、S、U、……)不能是基本数据类型,只能是引用数据类型,默认为Object类。
- 自定义泛型类或泛型接口时,类型变量在类名或接口名的后面;自定义泛型方法时,类型变量在修饰符的后面,返回值类型的前面。
- 通过关键字extends对类型变量加以约束,类型变量和限定类型可以是类,也可以是接口。
- 最多有一个限定类型是类,可以有多个限定类型是接口;多个类型变量用“,”分隔,多个限定类型用“&”分隔。
- 具有继承关系的类型作为泛型使用时,两个泛型类不再具有继承关系,但可以利用通配符“?”作为其公共父类。
- 有限制条件的通配符只能传入限制的类型。
- 无论何时定义一个泛型类型,都会自动提供一个相应的原始类型,即类型变量会被擦除,并替换为限定类型,对于无限定的变量则替换为Object类。
import java.util.*;
public class GenericTest {
public static void main(String[] args) {
Class1 class1 = new Class1();
Class2 class2 = new Class2();
Test1 test1 = new Test1();
Test2 test2 = new Test2();
Test<? extends Class1, ? super Test2> test3;
test3 = new Test<Class1, Test2>(class1, test2);
test3 = new Test<Test1, Test2>(test1, test2);
}
}
class Test<T extends Class1, S extends Class2 & Interface1> {
private T t;
private S s;
public Test(T t, S s) {
System.out.println("Test");
this.t = t;
this.s = s;
}
public <U extends T> void print1(U u) {
System.out.println("print1");
System.out.println(u);
}
public <U extends S> void print2(U u) {
System.out.println("print2");
System.out.println(u);
}
public void print3(List<? extends Class1> list) {
System.out.println("print3");
}
public void print4(List<? super Test2> list) {
System.out.println("print4");
}
}
class Class1 {
public Class1() {
System.out.println("Class1");
}
}
class Class2 {
public Class2() {
System.out.println("Class2");
}
}
interface Interface1 {
}
class Test1 extends Class1 {
public Test1() {
System.out.println("Test1");
}
}
class Test2 extends Class2 implements Interface1 {
public Test2() {
System.out.println("Test2");
}
}