本文是作者在对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<String> list1却不是Class类型。
2.参数化类型ParameterizedType:带有参数化的类或者接口对应的类型,比如List<String> s1、Map<K,V> map等对应的类型均是ParameterizedType类型,而List s1、Map map对应的类型是Class。
3.数组类型(GenericArrayType):带有参数化的类或者接口所表示的数组对应的类型,比如List<String> []s、Map<K,V> map[]等对应的类型均是GenericArrayType类型,而List []s、Map map[]是Class类型。
4.类型变量(TypeVariable):泛型本身的类型,比如T s中T对应的类型就是TypeVariable类型。
5. 通配符类型(WildcardType) :通配符对应的类型。? extends Map中?对应的类型就是WildcardType类型。
2.实例分析:
1.List<String> list包含哪几种类型?
答:包含2种类型:List<String>对应ParameterizedType类型,其中的String对应Class类型
2.Map<K,String> map包含哪几种类型?
答:包含3种类型:Map<K,String>对应ParameterizedType类型,其中K对应TypeVariable类型,String对应Class类型。
3.Map<String,V> [] maps包含哪几种类型?
答:包含4种类型:Map<String,V> []对应GenericArrayType类型,其中Map<String,V>对应ParameterizedType类型,String是Class类型,V是TypeVariable类型
4.Set<? extends Map> set包含哪几种类型?
答:包含2种类型:Set<? extends Map>对应ParameterizedType类型,其中?对应于WildcardType类型。
3.实战
结果
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<String> 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<K,String> 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<String,V> [] 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<String> list所涉及的类型:
java.util.List<java.lang.String>的类型是:ParameterizedTypeImpl
java.lang.String的类型是:Class
变量Map<K,String> map所涉及的类型:
java.util.Map<K, java.lang.String>的类型是:ParameterizedTypeImpl
K的类型是:TypeVariableImpl
java.lang.String的类型是:Class
变量Map<String,V> [] maps所涉及的类型:
java.util.Map<java.lang.String, V>[]的类型是:GenericArrayTypeImpl
java.util.Map<java.lang.String, V>的类型是: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的理解,如有错误,望评论提醒。