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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容