java泛型 擦除_Java泛型:泛型擦除详细介绍、泛型擦除的体现

泛型擦除

Java 泛型的参数只可以代表类,不能代表个别对象。由于 Java 泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。Java 编译器在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。-----百度百科

泛型擦除的体现

通过以下代码来感受以下什么是泛型擦除:

public class Erase {

public static void main(String[] args) {

// 创建两个不同泛型的list集合

List integerList = new ArrayList<>();

List stringList = new ArrayList<>();

System.out.println(integerList.getClass() == stringList.getClass());

System.out.println("integerList----> "+integerList.getClass().getName());

System.out.println("stringList----> "+stringList.getClass().getName());

}

}

输出结果

true

integerList----> java.util.ArrayList

stringList----> java.util.ArrayList

很明显发现,两个集合的泛型不同,但是比较class,返回的是true,并且通过反射获取到的className是java.util.ArrayList

不管是 ArrayList 还是 ArrayList,在编译完成后都会被编译器擦除成了 ArrayList。

Java 泛型擦除是 Java 泛型中的一个重要特性,其目的是避免过多的创建类而造成的运行时的过度消耗。所以,想 ArrayList 和 ArrayList 这两个实例,其实类实例是同一个。

可以把其他类型的数据放到指定了泛型的list集合中吗?

当然是可以的。因为泛型擦除的原因。完全可以将不相干的类型的数据存入指定泛型的集合中。

如下所示添加,肯定是要报错的,因为在编译的时候设定了规则,编译是不可能通过的。

09d5933b40852d9b20e2800d249e63cd.png

按理说,因为泛型擦除的原因,完全是可以将不相干类型的数据放到指定泛型的集合中的。其实,可以换一种思路,当list集合运行起来之后,这个list集合因为泛型擦除是没有指定泛型的,即class是没有泛型的,所以可以在运行期间获取这个list集合,然后将值放到该list集合中。

public class Erase {

public static void main(String[] args) {

Erase erase = new Erase();

erase.testErase();

}

List integerList = new ArrayList<>();

List stringList = new ArrayList<>();

public void testErase(){

Double d = 10d;

try {

// 通过反射机制获取字段,然后将double类型的数据放入泛型为Integer集合中

Field integerField = this.getClass().getDeclaredField("integerList");

integerField.setAccessible(true);

List integerFieldList = (List) integerField.get(this);

integerFieldList.add(d);

// 通过反射机制获取字段,然后将double类型的数据放入泛型为String集合中

Field stringField = this.getClass().getDeclaredField("stringList");

stringField.setAccessible(true);

List stringFieldList = (List) stringField.get(this);

stringFieldList.add(d);

}catch (Exception e){

e.printStackTrace();

}

System.out.println("integerList ---> "+integerList);

System.out.println("stringList ---> "+stringList);

}

}

输出结果

integerList ---> [10.0]

stringList ---> [10.0]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值