Java泛型理解,超级容易理解的 新手 教程!

Source

在这里插入图片描述

前言(先扯几句家常)

个人主张自学,但是也不能忘记了讨论的重要性,但是由于平时不z怎么看CSDN,所以呢我这边搞了一个小圈子,欢迎大家来哦~可以畅所欲言呀——java小圈子

不过CSDN评论区我也会不定时观看的,所以非强制性要求哦


这周真是产量低下,实在汗颜,怎么说这一周呢,,,

周一周二学校开运动会

我还想着我是文体部的,应该很轻松,谁知道天天那么多事情,真是累的要死哦

周二下午我还参加的有比赛项目,三级跳远,进了决赛,对于我这老胳膊老腿来说,真是遭不住哦

周三又被我们创新创业工作室拉过去参加比赛

拖着我那腰酸背痛的身体,我的天呐,确实需要锻炼锻炼了。。突然就跑题了

啊,就是这样导致我断断续续的更了两篇

周五又临近放假,周六做了一天的车,周日到家帮忙干了一天的活,确实是累的遭不住,八九点就睡了

今天算是颓废了一下午,上午也是去忙去了

哎,生活不易啊,这周这么搞,我应该已经凉透了

但是还是要坚持继续写的!!!!!!

学习必不可退缩!冲冲冲!!!

在这里插入图片描述

泛型!

当我第一次听到这个东西的时候,我是这样想的:

泛型?什么东西,听起来感觉挺高大上的,我能学会吗?我能理解吗?我会不会栽在这里?

是啊,听起来就蛮牛,蛮高大上的嘛,但是你需要仔细理解,啊不对,说得简单点,你就把这俩字拆开来解读不就完事了吗?

泛型:

泛:广泛

型:类型

对,其实就是这样,是不是瞬间感觉在这里插入图片描述

好嘛,这才哪跟哪啊,你要是这样想,就对了!哈哈,不要觉的他好难好难的

理解最重要,我一向反对死记硬背的学习,所以我也不抄别人的看着好高大上的解释,除了让人望而生畏之外,对理解并没有什么卵用。

像他们说的什么参数化类型,那玩意真的能让很多人理解吗?

并不能,至少在我看到这个的时候,是无法很清晰的理解到的,既然我做不到,那么根据某定理(想不起来名字了),那么肯定也有人和我一样,无法很明白的,很清晰的理解这个东西。

那我就按照我的理解来说了

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. 通配符

通配符,就是字面意思,可以通用的符号

不得不赞一句,见名知意的感觉是真的好,以后我们写代码的类啦,接口啦,方法啦,一定要记得这样命名,见名知意!!!

一般用于集合中传递数据时

  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) {
    
      //....}    


5. 完事

泛型就说这么多,相信大家对泛型也有了自己的认识,想去深挖的话,还是别来看我的博客

建议找大佬的博客钻研钻研一起进步一起学习!

结语

说了这么多,思来想去还是决定打波广告!

我搞了一个群,欢迎一起进步一起学习,一起加油!—— java小圈子
打完广告我就跑,真刺激
在这里插入图片描述