java泛型详解

泛型就是类型参数化,让类、接口、方法能够处理多种数据类型,而不需要为每种类型都写一份代码。

当你发现要为一个新类型复制粘贴代码时,就该考虑用泛型了!

泛型就像是Java的"万能模板",一份代码,多种用途,既安全又高效。

泛型类、接口、方法

// 语法:class 类名<类型参数>

使用场景

总结:什么时候用泛型?

强烈建议使用泛型的场景:

  1. 集合操作:List、Set、Map必须用,保证类型安全
  2. 工具类:处理多种类型数据的工具
  3. API响应:统一格式的接口返回
  4. 通用组件:会被多处复用的代码
  5. 数据转换:不同类型间的转换

List<T>- 列表

Map<K, V>- 键值对

响应结果<T>- 返回数据

基本语法格式

  1. 泛型类的写法
java 复制代码
// 语法:class 类名<类型参数> { ... }
// 这里的T就像"占位符",用的时候再确定具体类型

class 盒子<T> {  // 1. 在类名后面加<T>
    // 2. 在类里面,T可以当作一种类型来用
    private T 里面的东西;  // 这里T是"某种东西的类型"
    
    public 盒子(T 东西) {  // 构造方法参数也是T
        this.里面的东西 = 东西;
    }
    
    public T 拿出来() {  // 返回类型也是T
        return 里面的东西;
    }
}
  1. 多个类型参数
java 复制代码
// 语法:class 类名<T, U, V> { ... }
// 可以定义多个类型参数,用逗号隔开

class 双人座<T, U> {  // T和U是两个不同的类型
    private T 左边的人;
    private U 右边的人;
    
    public 双人座(T 左, U 右) {
        this.左边的人 = 左;
        this.右边的人 = 右;
    }
    
    public T 左边是谁() {
        return 左边的人;
    }
    
    public U 右边是谁() {
        return 右边的人;
    }
}

创建对象的写法

  1. 完整的写法
java 复制代码
// 完整的写法:类名<具体类型> 变量名 = new 类名<具体类型>();

盒子<String> 苹果盒子 = new 盒子<String>("苹果");
// 前面的<String>告诉编译器:这是一个装String的盒子
// 后面的<String>重复了,有点啰嗦
  1. 简化的写法(推荐)
java 复制代码
// Java 7+ 可以这样写:类名<具体类型> 变量名 = new 类名<>();

盒子<String> 苹果盒子 = new 盒子<>("苹果");
// 后面用空的<>,编译器会自动推断是String
// 这叫"钻石语法",像钻石<>的形状
  1. 空的<>是什么意思?
java 复制代码
// 1. 创建对象时的空<>
盒子<String> 盒子1 = new 盒子<>("苹果");
// 这个<>表示"和前面一样的类型"
// 编译器看到前面是<String>,就知道后面也是String

// 2. 如果不写<>会怎样?
盒子<String> 盒子2 = new 盒子("苹果");  // 有警告,不推荐
// 这叫"原始类型",相当于没有泛型检查

规则

规则1:声明时用<T>

规则2:使用时指定具体类型

规则3:空的<>表示"和前面一样"

规则4:类型安全检查

统一返回结果的用例

java 复制代码
public class Result<T> {
    private Integer code;//业务状态码  0-成功  1-失败
    private String message;//提示信息
    private T data;//响应数据

    //快速返回操作成功响应结果(带响应数据)
    public static <T> Result<T> success(T data) {
        //这里的T省略了,因为可以根据上下文推断出这里应该是什么类型。如果不能推断出,这里就要写上
        return new Result<>(0, "操作成功", data);
    }

    //快速返回操作成功响应结果
    public static <T> Result<T> success() {
        return new Result<>(0, "操作成功", null);
    }

    public static <T> Result<T> error(String message) {
        return new Result<>(1, message, null);
    }

}
相关推荐
爱笑的眼睛112 小时前
JAX 函数变换:超越传统自动微分的编程范式革命
java·人工智能·python·ai
liuyouzhang2 小时前
备忘-国密解密算法
java·开发语言
学编程就要猛2 小时前
算法:1.移动零
java·算法
北冥有一鲲2 小时前
LangChain.js:Tool、Memory 与 Agent 的深度解析与实战
开发语言·javascript·langchain
开开心心_Every2 小时前
优化C盘存储:自定义软件文档保存路径工具
java·网络·数据库·typescript·word·asp.net·excel
多则惑少则明2 小时前
AI大模型实用(八)Java快速实现智能体整理(使用LangChain4j-agentic来进行情感分析/分类)
java·人工智能·spring ai·langchain4j
吴佳浩 Alben2 小时前
Python入门指南(六) - 搭建你的第一个YOLO检测API
开发语言·python·yolo
love530love2 小时前
Win11+RTX3090 亲测 · ComfyUI Hunyuan3D 全程实录 ③:diso 源码编译实战(CUDA 13.1 零降级)
开发语言·人工智能·windows·python·comfyui·hunyuan3d·diso
qq_377112372 小时前
JAVA的平凡之路——此峰乃是最高峰JVM-GC垃圾回收器(2)-06
java·开发语言·jvm