JAVA基础-泛型

文章目录

泛型

​ 泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制

1.泛型的好处

  • 统一数据类型。
  • 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来

2.泛型的细节

  • 泛型中不能写基本数据类型'
  • 指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型
  • 如果不写泛型,类型默认是Object

3.泛型类

使用场景

当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类

格式

修饰符 class 类名<类型>{}

举例:

public class ArrayList < E > {
创建该类对象时,E就确定类型}

代码示例

构建泛型类

java 复制代码
//当我在编写一个类的时候,如果不确定类型,那么这个类就可以定义为泛型类。
public class MyArrayList<E> {

    Object[] obj = new Object[10];
    int size;

//    E : 表示是不确定的类型。该类型在类名后面已经定义过了。
//    e:形参的名字,变量名
    public boolean add(E e){
        obj[size] = e;
        size++;
        return true;
    }

    public E get(int index){
        return (E)obj[index];
    }
    
    @Override
    public String toString() {
        return Arrays.toString(obj);
    }
}

使用泛型类

java 复制代码
    public static void main(String[] args) {
        //String类型
        MyArrayList<String> list = new MyArrayList<>();

        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        System.out.println(list);
        
        //Integer类型
        MyArrayList<Integer> list2 = new MyArrayList<>();
        list2.add(123);
        list2.add(456);
        list2.add(789);

        int i = list2.get(0);
        System.out.println(i);
        System.out.println(list2);    
}

4.泛型方法

使用场景

方法中形参类型不确定时:

方案①:使用类名后面定义的泛型

方案②:在方法申明上定义自己的泛型

格式

修饰符 <类型>返回值类型 方法名(类型 变量名){}

举例:

public <T> void show (T t){}

代码示例

定义一个工具类:ListUtil

类中定义一个静态方法addAll,用来添加多个集合的元素。

java 复制代码
package a04mygenerics;

import java.util.ArrayList;

public class ListUtil {
    private ListUtil(){}
    //类中定义一个静态方法addAll,用来添加多个集合的元素。


    /*
    *   参数一:集合
    *   参数二~最后:要添加的元素
    *
    * */
    public static<E> void addAll(ArrayList<E> list, E e1,E e2,E e3,E e4){
        list.add(e1);
        list.add(e2);
        list.add(e3);
        list.add(e4);
    }

/*    public static<E> void addAll2(ArrayList<E> list, E...e){
        for (E element : e) {
            list.add(element);
        }
    }*/


    public void show(){
        System.out.println("尼古拉斯·纯情·天真·暖男·阿玮");
    }
}
java 复制代码
    public static void main(String[] args) {

        ArrayList<String> list1 = new ArrayList<>();
        ListUtil.addAll(list1, "aaa", "bbb", "ccc", "ddd");
        System.out.println(list1);


        ArrayList<Integer> list2 = new ArrayList<>();
        ListUtil.addAll(list2,1,2,3,4);
        System.out.println(list2);

    }

5.泛型接口

在接口名后面定义泛型,实现类确定类型,实现类延续泛型

修饰符 interface 接囗名<类型>{}

public interface List< E >{}

如何使用它:

1.实现类给出具体的类型

2.实现类延续泛型,创建实现类对象时再确定类型

6.泛型的继承

泛型不具备继承性,但是数据具备继承性

java 复制代码
package a04mygenerics;


import java.util.ArrayList;

public class GenericsDemo5 {
    public static void main(String[] args) {
        //创建集合的对象
        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();

        //调用method方法
        method(list1);
        method(list2);//报错,泛型不具备继承性
        method(list3);//报错,泛型不具备继承性

        list1.add(new Ye());
        list1.add(new Fu());//可以添加成功,数据具备继承性
        list1.add(new Zi());//可以添加成功,数据具备继承性
    }

    /*
    * 此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。
    * */
    public static void method(ArrayList<Ye> list) {

    }
}

7.泛型的通配符

此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。弊端:

利用泛型方法有一个小弊端,此时他可以接受任意的数据类型

Ye Fu zi Student

希望:本方法虽然不确定类型,但是以后我希望只能传递Ye Fu zi,此时我们就可以使用泛型的通配符

通配符

? 也表示不确定的类型,他可以进行类型的限定

? extends E:表示可以传递E或者E所有的子类类型

? super E:表示可以传递E或者E所有的父类类型

使用场景

定义类、方法、接口的时候,如果类型不确定,就可以定义泛型

如果类型不确定,但是能知道是哪个继承体系中的,可以使用泛型的通配符

通配符关键点:可以限定类型的范围。

相关推荐
30955666616 分钟前
股票接口返回 404 与空数组的排查笔记:证书状态与级别参数
java·笔记·python·ios·iphone·股票数据api·股票数据接口
nice_lcj52019 分钟前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
文丑颜不良啊35 分钟前
LeetCode2861~2880题目解析
java·leetcode
装不满的克莱因瓶1 小时前
设计模式之策略模式核心概念和应用场景
java·后端·设计模式·架构·系统架构·策略模式
晴天的雨.9921 小时前
【C++】继承篇
java·开发语言·c++
SomeOtherTime1 小时前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
qq_406981031 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
头发还在的女程序员1 小时前
Java在线租房系统源码解析:Spring Boot+Vue 3+UniApp房源管理与预约看房方案
java·vue.js·spring boot·租房小程序·租房系统·租房软件
FYKJ_20101 小时前
springboot同人周边订单管理系统48955-计算机毕业设计、课程设计
java·javascript·vue.js·spring boot·django·php·课程设计
总要学点什么1 小时前
第106篇:三维特效-流动线效果——让一颗光点沿整条线一路滚到头
开发语言·javascript·ecmascript·gis·webgl·材质·cesium