清华学霸首次分享!Java泛型全解宝典限时领取

Hello,今天给各位童鞋们分享的是Java泛型,赶紧拿出小本子记下来吧

清华学霸首次分享!Java泛型全解宝典限时领取

java泛型理解

泛型在java中经常使用,有很重要的作用,在做软件构造的实验,我对泛型的理解不是很深,但随着了解和运用越来越多,理解也就加深了,这里记录一下学习的理解

什么是泛型?

泛型,即“参数化类型”,是对java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类,可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样,泛型的本质是为了参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型,在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

对于常见的泛型模式,推荐的泛型类型变量有:

E:元素(element),多用于java集合框架

K:关键字(Key)

N:数字(Number)

T:类型(Type)

V:值(value)

T和T的区别:T是tpye的首字母缩写;T表示“返回值”是一个泛型,传入什么类型,就返回什么类型,而单独的“T"表示限制传入的参数类型

举个例子说明泛型的作用

清华学霸首次分享!Java泛型全解宝典限时领取

运行程序,崩溃

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

原因是ArrayList可以存放任意类型,例子中添加了一个String类型,添加了一个Integer类型,再使用时都以String的方式使用,因此程序崩溃了。为了解决类似这样的问题(在编译阶段就可以解决),泛型应运而生。

我们将第一行声明初始化list的代码更改一下,编译器会在编译阶段就能够帮我们发现类似这样的问题。

清华学霸首次分享!Java泛型全解宝典限时领取

泛型的特性

泛型只在编译阶段有效。看下面的代码:

清华学霸首次分享!Java泛型全解宝典限时领取

输出结果:D/泛型测试: 类型相同。

通过上面的例子可以证明,在编译之后程序会采取去泛型化的措施。也就是说Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。

对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。

泛型如何使用

泛型有三种使用方式,分别为:泛型类,泛型接口,泛型方法

1.泛型类

泛型类型用于类的定义中,最典型的是各种容器类,如:List,Set,Map

泛型的基本写法:

清华学霸首次分享!Java泛型全解宝典限时领取

举个例子:

清华学霸首次分享!Java泛型全解宝典限时领取

那如何使用呢

清华学霸首次分享!Java泛型全解宝典限时领取

结果:

清华学霸首次分享!Java泛型全解宝典限时领取

2.泛型接口

泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中,可以看一个例子:

清华学霸首次分享!Java泛型全解宝典限时领取

当实现泛型接口的类,未传入泛型实参时:

清华学霸首次分享!Java泛型全解宝典限时领取

当实现泛型接口的类,传入泛型实参时:

清华学霸首次分享!Java泛型全解宝典限时领取

3.泛型方法

泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型 。

假设需要实现这样一个方法:该方法负责将一个 Object 数组的所有元素添加到一个 Collection 集合中。考虑采用如下代码来实现该方法:

清华学霸首次分享!Java泛型全解宝典限时领取

上面定义的方法没有任何问题,关键在于方法中的c 参数,它的数据类型是 Collection。正如前面介绍的,Collection 不是 Collection 的子类型—所以这个方法的功能很有限,它只能将 Object[] 数组的元素复制到元素为 Object (Object 的子类不行)的Collection 集合中,击下面代码会引起问题。

清华学霸首次分享!Java泛型全解宝典限时领取

可见上面方法的参数类型不可以使用 Collection,
使用通配符 Collection<?> 也不行,因为Java 不允许把对象放进一个未知类型的集合里。
为解决这个问题,可以使用泛型方法,在声明方法时定义一个或多个类型形参。泛型用法格式如下:

清华学霸首次分享!Java泛型全解宝典限时领取

该泛型方法的方法签名比普通方法的方法签名多了类型形参声明,类型形参声明以尖括号括起来,多个类型形参直接以逗号(,)隔开,所有的类型形参声明放在方法修饰符和返回值类型之间。
采用支持泛型的方法,就可以将上面的 fromArrayToCollection 方法改写为如下形式

清华学霸首次分享!Java泛型全解宝典限时领取

可以看到Object被替换成了T,而且在修饰符和返回值中间加了

下面代码示范了完整用法

清华学霸首次分享!Java泛型全解宝典限时领取

上面程序调用了一个泛型方法,该泛型方法中定义了一个 T 类型形参,这个 T 类型形参就可以在该方法内当成普通类型使用。与接口、类声明中定义的类型参数不同的是,方法声明中定义的形参只能在该方法内使用,而接口、类声明中定义的类型形参则可以在整个接口、类中使用。

与类,接口中泛型参数不同的是,方法中的泛型参数无须显式传入实际类型参数,如上面程序所示,当程序调用 fromArrayToCollection() 方法时,无须在调用该方法前传入String、Object 等类型,但系统依然可以知道类型参数的数据类型,因为编译器根据实参推断类型实参的值,它通常推断出最直接的类型参数。

好啦,今天的文章就到这里了,希望能够帮助到屏幕前迷茫的你们

清华学霸首次分享!Java泛型全解宝典限时领取

如何领取学习资料?

转发分享此文,后台私信小编:“888” 即可获取。(注:转发分享,感谢大家)

展开阅读全文

页面更新:2024-05-17

标签:清华   编译器   数组   推断   数据类型   宝典   例子   元素   接口   定义   声明   阶段   参数   类型   代码

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top