关于对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<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.实战


javabean实体


测试main方法

结果

运行结果

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的理解,如有错误,望评论提醒。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容