美文网首页
关于对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的理解

    本文是作者在对Type五大分支类型具体所表达的定义在探索过程的总结。 1.在java中type总共分为5大分支类型...

  • 数组

    Java 中定义数组的语法有两种:type arrayName[];type[] arrayName;type 为...

  • JAVA数组的定义,遍历的方法

    Java 中定义数组的语法有两种: type arrayName[];type[] arrayName; type...

  • Retrofit

    关于Retrofit A type-safe HTTP client for Android and Java 一...

  • java知识总结之Type

    参考 Java中的Type Type是Java 编程语言中所有类型的公共高级接口(官方解释),也就是Java中所有...

  • 对Swift中type和Self的理解

    一、type type对应OC中的Class,是类类型。 二、Self Self当作为类方法返回值,返回的也必须是...

  • [Effective Java] Item 30: Use en

    在Java 1.5中,有两个类型被加入:enum type和annotation type。 在Java docs...

  • java_泛型

    类型擦除正确理解泛型概念的首要前提是理解类型擦除(type erasure)。 Java中的泛型基本上都是在编译器...

  • java type体系理解(转载)

  • 对Java中多态的理解

    首先给多态下个定义: 对于面向对象而已,多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载...

网友评论

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

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