美文网首页
关于对java中type的理解

关于对java中type的理解

作者: 狂奔的蜗牛8023 | 来源:发表于2018-12-21 11:05 被阅读0次

    本文是作者在对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的理解,如有错误,望评论提醒。

    相关文章

      网友评论

          本文标题:关于对java中type的理解

          本文链接:https://www.haomeiwen.com/subject/jhopkqtx.html