Java 泛型
发布日期:2022-02-26 00:17:48 浏览次数:9 分类:技术文章

本文共 1078 字,大约阅读时间需要 3 分钟。

如何使集合能够记住集合内元素各类型,取消类型转换,且能够达到只要编译时不出现问题,运行时就不会出“java.lang.ClassCastException”异常?

使用泛型。

1.定义。

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参,如List<T>),然后在使用/调用时传入具体的类型(类型实参,如List<String>、List<Integer>)。

2.自定义泛型接口、泛型类和泛型方法。

接口、类和方法也都可以使用泛型去定义,在具体使用时,可以分为泛型接口、泛型类和泛型方法。在泛型接口、泛型类和泛型方法的定义过程中,我们常见的如T、E、K、V等形式的参数常用于表示泛型形参,由于接收来自外部使用时候传入的类型实参。在使用泛型类时,虽然传入了不同的泛型实参,但并没有真正意义上生成不同的类型,传入不同泛型实参的泛型类在内存上只有一个,即还是原来的最基本的类型(泛型类的类型,如List<T>传入不同的泛型实参List<String>只接收字符串、List<Integer>只接收整数,但还是List),当然,在逻辑上我们可以理解成多个不同的泛型类型。

究其原因,在于Java中的泛型这一概念提出的目的,导致其只是作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段

3.类型通配符。

我们知道,Box<Number>和Box<Integer>实际上都是Box类型,那么类似于Box<Number>和Box<Integer>是否可以看成具有父子关系的泛型类型呢?通过提示信息,我们知道Box<Number>在逻辑上不能视为Box<Integer>的父类。

类型通配符一般是使用 ? 代替具体的类型实参。注意了,此处是类型实参,而不是类型形参!且Box<?>在逻辑上是Box<Integer>、Box<Number>...等所有Box<具体类型实参>的父类。由此,我们依然可以定义泛型方法,来完成此类需求。

有时候,我们还可能听到类型通配符上限和类型通配符下限类型通配符上限通过形如Box<? extends Number>形式定义,相对应的,类型通配符下限为Box<? super Number>形式,其含义与类型通配符上限正好相反。

转载地址:https://blog.csdn.net/TnTlittlefish/article/details/51443235 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android res文件夹下资源定义及使用
下一篇:DataGridView窗体传值方式

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月01日 17时40分41秒