java type 简书_关于对java中type的理解

本文是作者在对Type五大分支类型具体所表达的定义在探索过程的总结。

1.在java中type总共分为5大分支类型:

原始类型(Class):基本数据类型、枚举、数组等和泛型无关;

参数化类型(ParameterizedType):带有泛型的类型,也就是带有参数化类或者接口对应的类型;

数组类型(GenericArrayType):带有泛型的数组类型,也就是带有参数化类或者接口所表示的数组对应的类型;

类型变量(TypeVariable):泛型本身的类型;

通配符类型(WildcardType) :通配符对应的类型。

从上面的基本定义可以看出,要想理解这type的5大分支类型,还是要对泛型有一定的了解,我们知道在泛型还没出现之前,描述类的类型是Class,随着语言的优化,泛型的出现,而Class又无法描述泛型,故而出现了其余四种对于涉及泛型的描述。

对于泛型大致分为两种:

基本泛型、通配符泛型。

有了这些基础之后我们就可以对上面五中type分支类型进行剖析;

1.原始类型Class:不涉及泛型的所有类跟接口所对应的类型均是Class类型。

比如String s、String []s1、List list等对应的类型均是Class类型,而List list1却不是Class类型。

2.参数化类型ParameterizedType:带有参数化的类或者接口对应的类型,比如List s1、Map map等对应的类型均是ParameterizedType类型,而List s1、Map map对应的类型是Class。

3.数组类型(GenericArrayType):带有参数化的类或者接口所表示的数组对应的类型,比如List []s、Map map[]等对应的类型均是GenericArrayType类型,而List []s、Map map[]是Class类型。

4.类型变量(TypeVariable):泛型本身的类型,比如T s中T对应的类型就是TypeVariable类型。

5.  通配符类型(WildcardType) :通配符对应的类型。? extends Map中?对应的类型就是WildcardType类型。

2.实例分析:

1.List list包含哪几种类型?

答:包含2种类型:List对应ParameterizedType类型,其中的String对应Class类型

2.Map map包含哪几种类型?

答:包含3种类型:Map对应ParameterizedType类型,其中K对应TypeVariable类型,String对应Class类型。

3.Map [] maps包含哪几种类型?

答:包含4种类型:Map []对应GenericArrayType类型,其中Map对应ParameterizedType类型,String是Class类型,V是TypeVariable类型

4.Set extends Map> set包含哪几种类型?

答:包含2种类型:Set extends Map>对应ParameterizedType类型,其中?对应于WildcardType类型。

3.实战

0b85a2f09585?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

javabean实体

0b85a2f09585?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

测试main方法

结果

0b85a2f09585?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

运行结果

4.源码:

实体bean:

@Data

public class TestBean {

private Listlist;

private Mapmap;

private Map []maps;

private Setset;

}

@Slf4j

public class Main {

public static void main(String[] args)throws NoSuchFieldException {

Class clz = TestBean.class;

Field list_field = clz.getDeclaredField("list");

Field map_field = clz.getDeclaredField("map");

Field maps_field = clz.getDeclaredField("maps");

Field set_field = clz.getDeclaredField("set");

Type type = list_field.getGenericType();

System.out.println("变量List list所涉及的类型:");

toType(type);

if (typeinstanceof ParameterizedType) {

for (Type actualTypeArgument : ((ParameterizedType) type).getActualTypeArguments()) {

toType(actualTypeArgument);

}

}

System.out.println();

Type type1 = map_field.getGenericType();

System.out.println("变量Map map所涉及的类型:");

toType(type1);

if (type1instanceof ParameterizedType) {

for (Type actualTypeArgument1 : ((ParameterizedType) type1).getActualTypeArguments()) {

toType(actualTypeArgument1);

}

}

System.out.println();

Type type2 = maps_field.getGenericType();

System.out.println("变量Map [] maps所涉及的类型:");

if (type2instanceof GenericArrayType) {

GenericArrayType genericArrayType2 = (GenericArrayType) type2;

toType(genericArrayType2);

Type type3 = genericArrayType2.getGenericComponentType();

if (type3instanceof ParameterizedType) {

ParameterizedType parameterizedType2 = (ParameterizedType) type3;

toType(parameterizedType2);

Type[] type4 = parameterizedType2.getActualTypeArguments();

for (Type type5 : type4) {

toType(type5);

}

}

}

System.out.println();

Type type3 = set_field.getGenericType();

System.out.println("变量Set extends Map> set所涉及的类型:");

if (type3instanceof ParameterizedType) {

ParameterizedType parameterizedType3 = (ParameterizedType) type3;

toType(parameterizedType3);

Type[] type6 = parameterizedType3.getActualTypeArguments();

for (Type type7 : type6) {

toType(type7);

}

}

}

public static void toType(Type type) {

String s;

if (typeinstanceof Class) {

s ="Class";

}else {

s = type.getClass().getTypeName().substring(39);

}

System.out.println(new StringBuffer(type.getTypeName()).append("的类型是:").append(s));

}

}

打印结果:

变量List list所涉及的类型:

java.util.List的类型是:ParameterizedTypeImpl

java.lang.String的类型是:Class

变量Map map所涉及的类型:

java.util.Map的类型是:ParameterizedTypeImpl

K的类型是:TypeVariableImpl

java.lang.String的类型是:Class

变量Map [] maps所涉及的类型:

java.util.Map[]的类型是:GenericArrayTypeImpl

java.util.Map的类型是:ParameterizedTypeImpl

java.lang.String的类型是:Class

V的类型是:TypeVariableImpl

变量Set extends Map> set所涉及的类型:

java.util.Set extends java.util.Map>的类型是:ParameterizedTypeImpl

? extends java.util.Map的类型是:WildcardTypeImpl

以上内容是作者对于java中type的理解,如有错误,望评论提醒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值