Java泛型——帮助你更好的读懂源码<dog>

举报
叶明明 发表于 2023/01/22 18:49:59 2023/01/22
【摘要】 泛型泛型就相当于集合的标签,我们在使用集合<>的时候,就是在使用泛型要知道的是在jdk1.5以前我们只能把集合中的元素设计为Object,之后引入了泛型的概念来解决,我们把元素的类型设计成一个参数,这个类型参数就叫做泛型。 为啥要有泛型我们假设没有泛型会出现哪种情况,Object类型,是不是啥都能存放?少了限制package fanxing;import java.util.ArrayLi...

泛型

泛型就相当于集合的标签,我们在使用集合<>的时候,就是在使用泛型

要知道的是在jdk1.5以前我们只能把集合中的元素设计为Object,之后引入了泛型的概念来解决,我们把元素的类型设计成一个参数,这个类型参数就叫做泛型。

为啥要有泛型

我们假设没有泛型会出现哪种情况,Object类型,是不是啥都能存放?少了限制

package fanxing;

import java.util.ArrayList;

public class text01 {
    public static void main(String[] args) {
        ArrayList id = new ArrayList<>();
        id.add(1);
        id.add(2);
        id.add(3);
        id.add(4);
        id.add("ymm");//误存放
        for(Object obj : id){
            System.out.println(obj);
        }
    }
}

在这里插入图片描述
缺点:集合中可能出现不同类型的数据,不便于管理

添加泛型后:

package fanxing;

import java.util.ArrayList;

public class text01 {
    public static void main(String[] args) {
        ArrayList<Integer> id = new ArrayList<Integer>();
        id.add(1);//自动装箱了
        id.add(2);
        id.add(3);
        id.add(4);
        //id.add("ymm");会报错
        for(Object obj : id){
            System.out.println(obj);
        }
        for(Integer i : id){
            System.out.println(i);
        }
    }
}


优点:在编译初期就进行检查,不会出现后续的数据类型错误

在这里插入图片描述
在这里插入图片描述
就是将E给确定为Integer类型

泛型对应的数据类型:
都是引用数据类型,不能是基本数据类型,因为泛型本来就是给集合服务的,集合是引用数据类型,那么泛型自然也就是引用数据类型了,hh

简便写法:
ArrayList<Integer> id = new ArrayList<>();

泛型接口

对于初次接触泛型的小伙伴,可能有点懵,啥是泛型接口?
在这里插入图片描述
参考上面这个源码中的<E>这就是一个泛型接口,下面我们来手写一个泛型接口(学习这个东西,方便我们来看懂源码

public class Text1{

}
public class Text2<E> {
        
}
  1. Text1就是一个普通类
  2. Text2就是一个泛型类
  3. <>里面就是一个参数类型,这个类型是不确定的,起到一个占位的作用
  4. 里面像源码中一样也是引用数据类型
package fanxing;

import java.util.ArrayList;

public class text01 {
    public static void main(String[] args) {
        Text a = new Text();
        a.aa("jjjjj");
    }
    public static class Text<E> {
        int a;
        int b;
        public void aa(E a){
            System.out.println(a);
        }
    }
}

在这里插入图片描述
我们可以说是,如果在实例化的时候不指定数据类型,默认为Object类型

来看如果我们在实例化的时候指定数据类型呢?
在这里插入图片描述

package fanxing;

import java.util.ArrayList;

public class text01 {
    public static void main(String[] args) {
        Text<Integer> a = new Text();
        a.aa(1111);
    }
    public static class Text<E> {
        int a;
        int b;
        public void aa(E w){
            System.out.println(w);
        }
    }
}

在这里插入图片描述

继承中的泛型接口

package fanxing;

import java.util.ArrayList;

public class text01 {
    public static void main(String[] args) {
        Text01 son = new Text01();
        son.aa(123);
    }
    public static class Text<E> {
        public void aa(E a){
            System.out.println(a);
        }
    }
    public static class Text01 extends Text<Integer>{


    }
}

在这里插入图片描述

指定父类中的泛型,子类中无需再指定泛型,可以直接继承自父类中指定好的泛型,那么既然有指定好的,那么我们来看一下没有指定好的泛型是什么情况?
在这里插入图片描述
hh,红色报错!
如果父类不明确指定泛型,那么子类也会变成一个泛型类,这个E的类型可以在创建子类对象的时候确定
在这里插入图片描述
这像不像ArrayList中的源码呢?

泛型方法

这里有一个比较容易混淆的概念,泛型方法。
在这里插入图片描述
这是不是一个泛型方法呢?不是!并不是带泛型就是泛型方法

泛型方法的参数类型无关于当前类的泛型,我们通过下面的代码来看一下!

	public static class Text<E> {
        //不是泛型方法
        public void aa(E a){
            System.out.println(a);
        }
        //是泛型方法
        public <W>  void W(W b){
            
        }
    }

假设当前的类就没泛型,那么我们第一种写法就是正确的

调用泛型方法

package fanxing;

import java.util.ArrayList;

public class text01 {
    public static void main(String[] args) {
        Text t= new Text();
        t.W("j");
        
    }
    public static class Text<E> {
        //不是泛型方法
        public void aa(E a){
            System.out.println(a);
        }
        //是泛型方法
        public static  <W>  void W(W b){
            //泛型方法可以是静态方法
            System.out.println("我是泛型方法");
        }
    }

}

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。