JavaSE -- 泛型详细介绍

泛型

简介
  1. 集合存储数据底层是利用 Object 来接收的,意思是说如果不对类型加以限制,所有数据类型柔和在一起,这时如何保证数据的安全性 呢(如果不限制存入的数据类型,任何数据都能存入,当我们取出数据进行强转时无法保证成功,比如字母字符串是无法转为数字的 )。所以从 JDK5 以后,引入了一个新特性 --- 泛型 ,提供编译时类型安全检测机制,可以对存入的内容类型加以限制

  2. 泛型允许在定义类,接口时通过一个标识类表示其中某个属性的类型或者某个方法的返回值及参数类型。本质是参数化类型(将类型作为参数由用户传递)

  3. 这种参数类型可以用在类,接口和方法当中,分别称为泛型类,泛型接口和泛型方法

代码演示

自定义了一个简单的集合类,用于简单演示泛型的作用

java 复制代码
//自定义集合类
public class MyArrayList<E> {
    int size = 0;
    Object[] arr = new Object[10];
    //限制插入集合的类型
    public void add(E item) {
        arr[size] = item;
        size ++;
    }
    //返回值类型确定
    public E get(int idx) {
        return (E) arr[idx];
    }
}

//演示
public static void main(String[] args) {
    MyArrayList<Integer> arrayList = new MyArrayList<>();
    arrayList.add(100);
    Integer integer = arrayList.get(0);
    System.out.println(integer);
}
使用泛型

规范泛型使用字母表示的信息

  • T:Type (Java类),当类中属性要使用时可以用该字母表示
  • E:Element,在集合中使用,表示集合中元素的类型
  • K:Key(键),在表示键值对的时候使用
  • V:Value(值),在表示键值对的时候使用
  • N:Number(数值类型)
  • ?:表示不确定的 Java 类型
泛型类

格式public class 类名<泛型>

注意事项 :泛型类型必须是引用数据类型。基本数据类型不可以,定义泛型类,在类后面添加尖角号,尖角号内部填类型参数,可以有多个参数,参数之间使用逗号分隔

代码:

java 复制代码
//泛型类
public class User<T> {
    private T value;
    public User() {
    }
    public User(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }
    public void setValue(T value) {
        this.value = value;
    }
}

//测试
public static void main(String[] args) {
    User<Integer> user = new User<>();
    user.setValue(250);
    Integer value = user.getValue();
}
泛型接口

格式public interface 类名<泛型>

代码:

java 复制代码
//泛型接口	
public interface Play<T>{
    void show(T name);
}
class Impl1<T> implements Play<T> {
    @Override
    public void show(T name) {
        System.out.println(name);
    }
}

//测试
public class Main {
    public static void main(String[] args) {
        Impl1<String> impl1 = new Impl1<>();
        impl1.show("梨花");
    }
}
泛型方法

在调用方法时才去指名方法的参数和返回值的类型

代码:

java 复制代码
public class Method {
    //无返回值
    public static <T> void method1(T value) {
        System.out.println(value);
    }
    有返回值
    public static <T> T method2(T value) {
        return value;
    }
}
泛型通配符

用于解决泛型之间的引用传递的特殊语法,主要分为三种情况

  • <?> :无边界的通配符,主要作用是让泛型能够接受未知类型的数据。在没有赋值之前,表示可以接受任何数据类型,赋值后,不能往里面添加元素。

  • <? extends E>:固定上边界的通配符,了解这个之前看看几个概念

    • 协变:在使用父类类型的场景的地方可以改用子类类型(父类应用指向子类对象
    • 逆变:在使用子类类型的场景的地方可以改用父类类型(子类引用指向父类对象
    • 不变:不能做到以上两点

    数组是可以支持协变(父类引用指向子类)。泛型是不支持协变的。这种设计大大降低了程序的灵活性,为了解决这个问题,设计出固定上边界的通配符。能够接受指定类及其子类类型的数据 。虽然使用的是 extends 关键字,但是不限于继承关系,接口引用关系也可以.

    java 复制代码
    public class Method {
        public static void main(String[] args) {
            MyArrayList<b> arrayList = new MyArrayList<>();
            Test(arrayList);
        }
        public static void Test(MyArrayList<? extends a> arrayList) {}
    }
    class a {}
    class b extends a {}
    class c extends a {}
  • <? suoer E>:固定下边界的通配符,接受指定类及其父类类型(或接口)的数据。

相关推荐
sun03224 分钟前
【架构基础】Spring中的PropertySourcesPlaceholderConfigurer介绍 (并非新知识,比较古老的一种使用方式)
java·spring·架构
CoovallyAIHub6 分钟前
AAAI 2026这篇杰出论文说了什么?用LLM给CLIP换了个“聪明大脑”
深度学习·算法·计算机视觉
chilavert3187 分钟前
技术演进中的开发沉思-356:重排序(中)
java·开发语言
毕设源码-邱学长7 分钟前
【开题答辩全过程】以 基于SSM的儿童福利院管理系统为例,包含答辩的问题和答案
java·eclipse
devmoon10 分钟前
为 Pallet 搭建最小化 Mock Runtime 并编写单元测试环境
开发语言·单元测试·区块链·智能合约·polkadot
TT哇13 分钟前
【实习】数字营销系统 银行经理端(interact_bank)前端 Vue 移动端页面的 UI 重构与优化
java·前端·vue.js·ui
Physicist in Geophy.18 分钟前
一维波动方程(从变分法角度)
线性代数·算法·机器学习
Elieal23 分钟前
SpringBoot 数据层开发与企业信息管理系统实战
java·spring boot·后端
识君啊23 分钟前
MyBatis-Plus 逻辑删除导致唯一索引冲突的解决方案
java·spring boot·mybatis·mybatis-plus·唯一索引·逻辑删除
im_AMBER24 分钟前
Leetcode 115 分割链表 | 随机链表的复制
数据结构·学习·算法·leetcode