Java泛型
Java泛型
当我第一次听到这个东西的时候,我是这样想的:
泛型?什么东西,听起来感觉挺高大上的,我能学会吗?我能理解吗?我会不会栽在这里?
是啊,听起来就蛮牛,蛮高大上的嘛,但是你需要仔细理解,啊不对,说得简单点,你就把这俩字拆开来解读不就完事了吗?
❝「泛型:」
泛:广泛
型:类型
❞
对,其实就是这样,是不是瞬间感觉
好嘛,这才哪跟哪啊,你要是这样想,就对了!哈哈,不要觉的他好难好难的
理解最重要,我一向反对死记硬背的学习,所以我也不抄别人的看着好高大上的解释,除了让人望而生畏之外,对理解并没有什么卵用。
像他们说的什么参数化类型,那玩意真的能让很多人理解吗?
并不能,至少在我看到这个的时候,是无法很清晰的理解到的,既然我做不到,那么根据某定理(想不起来名字了),那么肯定也有人和我一样,无法很明白的,很清晰的理解这个东西。
那我就按照我的理解来说了
1. 认识Java中的泛型使用
那么我们先来看看这个代码
ArrayList<String> b = new ArrayList<>();
之前说过,哪个小小的尖括号里面是放类型的,可以是任意的「引用类型」
何为引用类型:字符串,数组,接口,类。。。
那么我需要整型的怎么办,之前也说过,装箱,装箱为Integer这种类型的就可以了
好,言归正传,这个代码我们很熟悉,创建一个ArrayList集合对象嘛,形式我们也很熟悉,类的实例化对象嘛。
但是你有没有发现,这个格式貌似和我们自己定义的类的实例化对象的格式不太一样?
那么再来看看我们之前创建的Girl类的实例化
Girl girl = new Girl();
大致一看,还是差不多的:
类名 自定义名字 = new 类名;
但是仔细一看就不一样了,尖括号,对,我们创建的Girl中没有尖括号。
那么这个尖括号是干嘛的呢?联想我们的这个博客,你是不是若有所思?难不成,这就是泛型?
对啊,这就是泛型啊,这就是Java中的具体使用,用来广泛特指别的类型
说到这里,有没有一种恍然大悟的感觉
在这里插入图片描述2. 泛型特性
「泛型类型在逻辑上看成是多个不同的类型,实际上都是相同的基本类型」
3. 泛型使用
相信经过上面的解释,你已经对泛型有所理解,那么来看看我们怎么使用泛型吧
先来看看如何定义一个泛型类
class 类名<泛型类型(一般使用T,K,V,N,也可以使用别的)>{
public 泛型类型 变量名; //初始化一个泛型类型的变量
public 泛型类型 方法名(泛型类型 变量名){
代码块;
}
}
应该,很清晰吧,都是之前学过的东西了
那么来看看怎么使用的吧!
这次测试还是我们的妹子类
由于英文不好,主类名就用拼音了,见谅见谅
public class Fanxing {
public static void main(String[] args) {
Gril5_3<String> text = new Gril5_3<>("测试成功");
text.setT("hello");
String a = text.getT();
System.out.println(a);
}
}
class Gril5_3<T>{
private T t;
public Gril5_3(T t){
this.t = t;
System.out.printf("测试泛型ddd %s",t);
System.out.println();
}
void setT(T t){
this.t = t;
}
T getT(){
return t;
}
}
应该没什么问题吧,set和get用于封装,使用泛型类型替代了原来的类型,定义属性的时候也使用泛型类型替代
运行结果:
在这里插入图片描述好好好,好啊,我们成功了!
那么需要注意的是,我们在实例化前,我们的类型T可以是任意类型的,意思就是,你定义是什么类型,他就是什么类型的。
4. 通配符
通配符,就是字面意思,可以通用的符号
不得不赞一句,见名知意的感觉是真的好,以后我们写代码的类啦,接口啦,方法啦,一定要记得这样命名,见名知意!!!
一般用于集合中传递数据时
-
当使用泛型类或者泛型接口,泛型的类型你自己都不确定的时候,可以通过通配符<?>表示。一旦程序当中使用泛型的通配符后,只能使用Object类中的共性的方法,集合中元素本身方法无法使用 此时只能接收数据,不能往集合当中存储数据 -
通配符的高级使用—受限泛型(泛型的上限和下限) 上限:格式: 类型名称 <? extends 类名> 对象名称 意义:只能接受该类型及其子类 下限:格式:类型名称 <? super 类名> 对象名称 意义:只能接受该类型及其父类
示例说明
public static void main(String[] args) {
Collection<Integer> list01 = new ArrayList<Integer>();
Collection<String> list02 = new ArrayList<Integer>();
Collection<Number> list03 = new ArrayList<Integer>();
Collection<Object> list04 = new ArrayList<Integer>();
}
// 定义方法 用于接收任意的数据类型
public static void getElement(Collection<?> coll) {//.....}
// 定义方法 用于接收数字类型 Number类型或者Number的子类Integer等
pubic static void getElement(Collection<? extends Number> coll){//...}
// 定义方法 用于接收Number类型及其父类的类型
public static void getElement(Collection<? super Number> coll) {//....}
5. 完事
泛型就说这么多,相信大家对泛型也有了自己的认识,想去深挖的话,还是别来看我的博客
建议找大佬的博客钻研钻研一起进步一起学习!
- 点赞
- 收藏
- 关注作者
评论(0)