泛型!
当我第一次听到这个东西的时候,我是这样想的:
泛型?什么东西,听起来感觉挺高大上的,我能学会吗?我能理解吗?我会不会栽在这里?
是啊,听起来就蛮牛,蛮高大上的嘛,但是你需要仔细理解,啊不对,说得简单点,你就把这俩字拆开来解读不就完事了吗?
泛型: 泛:广泛 型:类型 |
对,其实就是这样,是不是瞬间感觉。
好嘛,这才哪跟哪啊,你要是这样想,就对了!哈哈,不要觉的他好难好难的。
理解最重要,我一向反对死记硬背的学习,所以我也不抄别人的看着好高大上的解释,除了让人望而生畏之外,对理解并没有什么卵用。
像他们说的什么参数化类型,那玩意真的能让很多人理解吗?
并不能,至少在我看到这个的时候,是无法很清晰的理解到的,既然我做不到,那么根据某定理(想不起来名字了),那么肯定也有人和我一样,无法很明白的,很清晰的理解这个东西。
那我就按照我的理解来说了!
1. 认识Java中的泛型使用
那么我们先来看看这个代码:
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. 通配符
通配符,就是字面意思,可以通用的符号
不得不赞一句,见名知意的感觉是真的好,以后我们写代码的类啦,接口啦,方法啦,一定要记得这样命名,见名知意!!!
一般用于集合中传递数据时
1)当使用泛型类或者泛型接口,泛型的类型你自己都不确定的时候,可以通过通配符<?>表示。一旦程序当中使用泛型的通配符后,只能使用Object类中的共性的方法,集合中元素本身方法无法使用。
此时只能接收数据,不能往集合当中存储数据。
2)通配符的高级使用—受限泛型(泛型的上限和下限)
上限:格式: 类型名称 <? 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) {//....} |
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理