Java泛型的逐步理解

理清泛型之前,先引入容器的概念。

容器:

就是字面意思,存放东西用。而在java里容器类就是专门存放数据的类,例如集合ArrayList等等。集合这类容器都可以存放多个数据,我们也可以构建一个只存放单个元素的简单容器。
在这里插入图片描述
再利用数组实现存放多个数据的简单容器:(也可以使用链表实现类似LinkedList)
在这里插入图片描述
实现了存放数据后,发现只能存放固定的String类型数据,要实现存放任意类型怎么处理?
利用Object么?尝试一下:
在这里插入图片描述
由上,**为了在创建容器对象时,指定任意且唯一一种类型的数据存入,这就是泛型应该要实现的效果。

泛型目的及概念:

泛型就是把类型明确的工作 推迟到创建对象或调用方法的时候才去明确 的特殊类型.
具体了解泛型的使用前,先给个参照:
方法和形参,就是设定了传入实参的数据类型,明确方法实参只能依照形参类型传入。
形参和实参,就是方法定义时,不用指定明确的参数数据,只相当于一个公式中的变量,使用方法的时候,再传入具体的实参数据。
同理,容器和泛型,泛型是对容器中元素引用类型的形式设定,明确容器中元素只能存入指定引用类型。区别就是,方法的形参类型在其定义时就已经明确**,而泛型的类型需要创建对象时才明确。
同时,泛型又是引用类型的形参,即明确的具体类型就是引用类型的实参。**
例如ArrayList{}
当创建对象时才明确类型ArrayList list = new ArrayList<>();即传入引用类型的实参String后,此容器内将只能存储String类型元素。
还是依照上面的例子:
在这里插入图片描述
在这里插入图片描述
我们知道引用类型即具体某一个类,String、ArrayList等等,引用类型数据都是对应类的实例对象引用;在创建容器对象时我们要指定泛型具体的引用类型,例如ArrayList list

构建容器时的泛型使用:

类泛型:

那么,当我们在构建ArrayList等容器类时,它的泛型如何指定呢,为什么一般会用T
我们构建泛型容器,是为了存入任意且唯一引用类型的数据,所以这时的泛型设定肯定要能代表所有引用类型。而上面已经提到过,构建容器时的泛型只是相当于一个形参,它没有具体意义,所以可以T,可以E等等。一般泛型设计使用E、T、K、V (E:element T: type K: key V: value)

方法泛型

泛型容器类的使用大家应该比较清楚了,那么方法的泛型有什么区别么?
在这里插入图片描述

泛型通配符

泛型类和泛型方法的定义已经比较清楚了,但是如果在创建对象或者调用泛型方法时无法明确类型, 就需要使用泛型通配符 ?
?extends 父类 //类型范围上限
?super 子类 //类型范围下限

在这里插入图片描述
只需要注意一点,泛型通配符是在创建对象和调用方法时使用,而在定义泛型类和定义泛型方法时不能使用

public void run(ArrayList<?> list) //这种普通方法定义形参,形参可以使用泛型,实际上是创建的ArrayList对象引用无法明确类型使用通配符,而不是定义的泛型方法中使用通配符

public <?> void add(? s){} // 报错
public <Container<?>> void add(Container<?> cup) //报错
在这里插入图片描述
在这里插入图片描述
一系列尝试后,创建对象时可以直接使用通配符,定义方法时,使用通配符的一般是作为形参的容器对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值