对于泛型以及泛型擦除的理解

泛型的定义:泛型的本质就是参数化类型,也就是让数据类型作为参数传递,其中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> { // 保留父类的泛型,同时在子类中增加新的泛型
}

可以通过反射添加其他类型元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值