java getactualtypearguments_Java泛型

本文介绍的知识点

泛型是什么?

泛型的使用

在反射中使用泛型

在集合类中使用泛型

关于泛型擦除如何理解?如何避免泛型擦除带来的影响?

泛型是什么

JDK1.5增加了泛型支持在很大程度上都是为了让集合能记住其元素的类型。在没有泛型前,一旦把一个对象“丢进”java集合中,集合就忘记对象的类型,把所有的对象当成Object处理。增加了泛型支持的集合后,完全能够记住集合元素的类型,并可以在编译时检查集合中的元素类型,如何试图添加不满足类型要求的对象,编译器就会提示报错。

泛型的使用

//基本使用

List list = new ArrayList();

list.add(new Apple());

list.add(new Apple());

list.add(new Apple());

复制代码//并不存在泛型类

List l1 = new ArrayList<>();

List l2 = new ArrayList<>();

//调用getClass()方法来比l1和l2的类是否相等

System.out.println(l1.getClass() == l2.getClass());

复制代码

运行上面的代码片段,可能有读者认为应该输出false,但实际输出true。因为不管泛型的实际类型参数是什么,他们在运行时总有同样的类(Class)。

注意:

java.util.Collection cs = new java.util.ArrayList<>();

//下面的代码引起错误,instantceof运算符后不能使用泛型

if(cs instantceof ArrayList){...}

复制代码

设定类型的上&下限

//以下类的继承关系为:RedApple extends Apple extents Fruit

List list = new ArrayList();

list.add(new Apple());

list.add(new Apple());

list.add(new Apple());

//常用场景就是作为参数输入--拓展set方法设置数据的类型

final List super RedApple> list2 = list;

list2.add(new RedApple());

list2.add(new RedApple());

list2.get(0)//此处没有意义,需要知道上限的修饰符super不支持get操作就行

//此时list集合中包含了3个类型Apple数据,2个类型RedApple数据

//常用的场景就是作为方法返回或者成员变量输出--拓展get方法获取的类型

final List extends Apple> list1 = list;

list1.add(new Apple());//报错,不允许插入任何类型得数据

Fruit fruit = list1.get(0);

Apple apple = list1.get(0);

复制代码

泛型方法和类型通配符的区别

定义:

public interface Collection{

boolean containsAll(Collection> c);

boolean addAll(Collection extend E> c);

}

复制代码

上面的程序可以使用类型通配符转换

public interface Collection{

boolean containsAll(Collection c);

boolean addAll(Collection c);

}

复制代码

在反射中使用泛型

有个静态方法如下,通过反射生成对象

public static Object getInstance(String clsName){

Class cls = Class.forName(clsName);

return cls.newInstance();

}

//比如我们用来创建Date对象的时候

Date d = (Date)getInstance("java.util.Date");//出现强转

复制代码

如何避免上面创建对象的时候,对象的强转呢?将上面的静态方法改造如下:

public static T getInstance(Class cls){

return cls.newInstance();

}

//比如我们创建Date对象

Date d = getInstance(Date.class);//不需要强转

复制代码使用反射来获取泛型类型信息

//成员变量

Map f;

Class> a = f.getType();//用来获取f的类型Map.class

Type gType = f.getGenericType();//获取成员变量的泛型类型

//要访问泛型类型的里面的类型,方法调用如下

if(gType instanceof ParameterizedType){

ParameterizedType pType = (ParameterizedType)gType;

pType.getRawType();//获取原始类型 interface java.util.Map

Type[] tArgs = pType.getActualTypeArguments();

tArgs[0];//返回:class java.lang.String

tArgs[1];//返回:class java.lang.Integer

}

复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值