java中什么泛型_Java中的泛型

本文详细介绍了Java泛型的用途,包括提高代码复用性、避免类型转换异常,以及泛型类、泛型接口和泛型方法的定义。还探讨了类型变量的限定,如extends和super的使用,以及泛型的约束和局限性,如不能实例化类型变量、静态上下文中类型变量失效等。最后,解释了泛型类型的继承规则和实际应用案例。
摘要由CSDN通过智能技术生成

1、为什么要使用泛型?

(1)适用于多种数据类型执行相同的代码,利于封装(如,封装Base类、统一的适用于recycleview的adapter等)

(2)泛型中的类型在使用的时候,直接指定即可,不需要进行强制转换。数据转换是很容易带来数据异常的,尤其是当服务端传过来的数据与我们接收的数据类型不同的时候。

2、泛型类、泛型接口、泛型方法?

泛型方法

引入一个类型变量T(其他大写字母都可以,不过常用的就是T,E,K,V等等),并且用<>括起来,并放在类名的后面。泛型类是允许有多个类型变量的。例如:

一个类型变量

212edc25e04684b94af49299b5afb39c.png

两个类型变量

e4cf8bd61fb5465012efee8f3edac23d.png

泛型接口

泛型接口与泛型类的定义基本相同

bb91201531b3440444b4a3cbe0acdc4f.png

而实现泛型接口的类有两种实现方法:

(1)未传入泛型参数时,那么该类也属于泛型类

d476f580748fefcfd0ad0f04822b52e5.png

那么在new出该实例对象时,需要指定具体类型

db374923182d269d73015632144a23bb.png

(2)在实现泛型接口时,传入泛型参数。

fcb5fcc677129df2c89dc90be17ee4db.png

那么在new出该类的实例时,与普通的类就没区别了。

泛型方法

6f2d07d0b316a793ba67282805eab922.png

public代表修饰符,表示泛型方法,紧跟后面的T表示返回值。

泛型方法是在调用方法的时候指明泛型的具体参数类型,泛型方法可以在任何场景中使用,包括普通类和泛型类。但是在泛型类中定义普通方法和泛型方法是有区别的:

普通方法:

a49ef0856d952ef6f583b382bac4fe40.png

泛型方法:

4224e14d5f8e211880ac9123c92b4860.png

关键点:

3、限定类型变量

有时候我们需要对变量类型进行约束。比如我们定义一个泛型方法:

054b3b894d039d8351d53d0de745a0f7.png

如何才能够保证传进来的a、b两个参数一定有compareTo方法呢?那么我们就要对T进行约束,保证传进来的T参数的类型实现了Comparable类

641fbe1965d330fb5bce6a7ec7114b5f.png

T extends Comparable表示,传进来的实例对象必须实现了Comparable类,否则将发生编译错误

2fd41eb3893ba3c8436371481d11af35.png

extends左右都允许有多个,如T,VextendsComparable & Serializable

注意限定类型的时候,只允许有一个类,允许多个接口,如果所限定的类型包含类和接口,那么类要放在最前面,也就是紧跟extends之后的第一个要放类。

类型限定既可以放在泛型方法上,也可以用在泛型类上

T super XXX跟 extends用法一样,只不过super表示传入的类型T只能是XXX或XXX的父类,最高为object类

4、泛型中的约束和局限性

现在我们有泛型类

0a1beaf7bffcb68e73bf60e59f7cf84b.png

(1)不能用基本类型实例化

b35eb4c867cfe08f08394e5a56d57ec2.png

(2)运行时,类型查询只适用于原始类型

因为类型擦除,java虚拟机中的对象并没有泛型类这一说,instanceof和getClass()只能查询到原始类型, 具体的泛型类型时无从得知的。

9c22141707b9e05d8e9f8dafd513c6ae.png

(3)泛型类的静态上下文中类型变量失效

不能在静态域或静态方法中使用泛型。因为泛型是需要我们在创建对象的时候才知道是什么类型,而对象创建过程中,代码的执行先后顺序是最先执行static部分,然后才是构造函数等。

因此,在对象初始化之前static部分的代码已经执行,而此时的static块并不知道到底是什么类型,因为这个时候我们的对象还没初始化。

2ae988d00633b89953e21c39814aaf8d.png

(4)不能创建参数化类型的数组

例如Restrict array = new Restrict[10]是错误的,

我们只能声明Restrict[] array;

(5)不能实例化类型变量

8d386969d17952fbdce658e088c0a236.png

(6)不能补货泛型类的实例

f2c24b743c98ff3d7e94bd273a9d1930.png

但可以这样

3a7e458baa636d61090d5823fda4b51d.png

5、泛型类型的继承规则

现在我们有一个类和子类

d0448b6aa5ad79fb5246f63ecbb828a1.png

b1d4075fa9fe43bb2abe1b5b9d8927d3.png

有一个泛型类

b56f75c91177ceb284485741cbddc57a.png

Pair和Pair之间没有任何关系

7ca4f296b61957a990529a6f4b2d975e.png

但是泛型类之间可以继承和扩展其他泛型类,例如:List和ArrayList

39a878d68a851207591f63135a114bd5.png

泛型类和泛型接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值