泛型的定义:泛型的本质就是参数化类型,也就是让数据类型作为参数传递,其中E相当于形式参数负责占位,而使用集合时<>中的数据类型相当于实际参数,用于给形式参数E进行初始化,从而使得集合中所有的E被实际参数替换,由于实际参数可以传递各种各样广泛的数据类型,因此得名为泛型。
泛型修饰类-》泛型类
泛型修饰接口-》泛型接口
泛型修饰方法-》泛型方法
public class Example<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
在编译后,虽然我们在代码中使用了 Example<String>
或 Example<Integer>
等具体类型,但生成的字节码中的 Example类将不包含这些类型信息。它会被视为一个原始的 Example类,其中 T
被替换为其边界类型(如果没有指定边界,则为 Object
)。
泛型 广泛的类型
List lt1 = new LinkedList();
// Java7开始的新特性: 菱形特性 就是后面<>中的数据类型可以省略
List lt3 = new LinkedList<>();
// 笔试考点
// 试图将lt1的数值赋值给lt3,也就是覆盖lt3中原来的数值,结果编译报错:集合中支持的类型不同
//lt3 = lt1; Error
看类是否支持泛型,主要判断其是否有尖括号<> E K T V都可 这样就可以传递参数类型
泛型擦除(编译时,Java编译器会将泛型信息移除):
Java的泛型是伪泛型,使用泛型的时候加上泛型类型参数,在编译器生成的字节码的时候会去掉,这个过程称为泛型擦除。
举例:List等类型,在编译之后都会变成LIst。JVM看到的只有List,而由泛型附加的信息对于JVM是不可见的。
常见父子类泛型分析:
//public class SubPerson extends Person { // 不保留泛型并且没有指定类型,此时Person类中的T默认为Object类型 擦除
//public class SubPerson extends Person<String> { // 不保留泛型但指定了泛型的类型,此时Person类中的T被指定为String类型
//public class SubPerson<T> extends Person<T> { // 保留父类的泛型 可以在构造对象时来指定T的类型
public class SubPerson<T, T1> extends Person<T> { // 保留父类的泛型,同时在子类中增加新的泛型
}
可以通过反射添加其他类型元素。