java泛型擦除原理,学会Java泛型系列(三):泛型原理-擦除

前面提到过,Java泛型是1.5才引进来的,不像其他语言天生就支持泛型。为了兼容1.5之前的代码,Java从编译器动手,使用擦除的手段支持泛型,这也使得Java的泛型有局限性。下面讲解擦除的原理及其局限性,对Java泛型有个全面的了解,在使用泛型的时候不再疑惑。

擦除

List strList = new ArrayList<>();

List intList = new ArrayList<>();

System.out.println(strList.getClass().getName()); //java.util.ArrayList

System.out.println(intList.getClass().getName()); //java.util.ArrayList

System.out.println(strList.getClass() == intList.getClass()); //true

可见,在运行时List与List的类型信息是一样的

class Holder{

private T t;

public Holder(T t){

this.t = t;

}

}

Holder stringHolder = new Holder<>("str");

Holder intHolder = new Holder<>(123);

System.out.println(Arrays.toString(stringHolder.getClass().getTypeParameters())); //[T]

System.out.println(Arrays.toString(intHolder.getClass().getTypeParameters())); //[T]

getTypeParameters返回泛型声明对应的类型参数,从打印上看到并不是返回具体的类型,二是返回[T],是一个占位标识符。

泛型会擦除掉类型参数,类里面的声明会变成类型边界(类型边界后面会讲到),如果没有声明类型边界就是Object。当你想使用T的时候,不知道它具体的类型,只能当做类型边界的类,调用它的方法。

擦除只是在使用T的时候,上面看到stringHolder.get()的时候编译器会自动帮我们把返回的参数转换为String类型

边界

class Animal{

private String name;

public Animal(String name){

this.name = name;

}

public String getAnimalName() {

return name;

}

}

class Holder{

private T pet;

public Holder(T t){

pet = t;

}

}

class Holder2{ //声明Animal为类型参数的边界

private T pet;

public Holder2(T t){

pet = t;

pet.getAnimalName(); //类型擦除到第一边界,可以有多个边界

}

}

Holder2声明了类型参数的边界,编译器实际上会把类型参数替换为它的擦除,T就相当于Animal,pet就行可以使用Animal的方法,相应地pet也只能接收Animal或者Animal的子类

Holder2 holder2 = new Holder2<>(new Animal("aaa"));

Holder2 holder3 = new Holder2<>(new Dog("bbb"));

Holder2 holder4 = new Holder2<>(new Object()); //编译不通过

多边界

边界可以定义多个,与集成一样,只能定义一个class的边界+多个接口的边界,并且class必须放在开始

class Animal{

private String name;

public Animal(String name){

this.name = name;

}

public String getAnimalName() {

return name;

}

}

interface Fly{

void fly();

}

interface Run{

void run();

}

class Holder{

}

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值