泛型类和泛型方法

泛型编程允许你编写与类型无关的代码,这意味着你可以编写能够处理多种类型的类和方法,而无需为每种类型编写单独的实现。这不仅提高了代码的复用性,还增强了类型安全性。

泛型类

泛型类是在实例化时接收一个或多个类型的类。定义泛型类的基本语法如下:

csharp 复制代码
public class GenericClass<T> {
    private T t;

    public void setT(T t) {
        this.t = t;
    }

    public T getT() {
        return t;
    }
}

在这个例子中,<T>是类型参数,它表示这个类可以操作一种未知类型的对象。当你创建这个类的一个实例时,你需要指定类型参数的具体类型,例如 GenericClass<Integer> 或者 GenericClass<String>

泛型方法

泛型方法是指在方法签名中声明类型参数的方法。这意味着该方法可以在调用时操作不同类型的对象,而不需要在类级别上指定这些类型。

swift 复制代码
public class Utility {
    public static <T> ResponseEntity<T> send(JSONObject payload, Class<T> responseType){}

}

第一个 <T>:泛型类型变量的声明 :声明这是一个泛型方法,并定义泛型类型变量 T,必须紧接在 static 关键字之后、返回类型之前。告诉编译器,这个方法内部会使用一个未具体指定的类型 T,在调用时由用户传入的 responseType 决定具体类型。

第二个 <T>:返回类型的泛型参数 :指定方法返回值类型为 ResponseEntity<T>,其中 T 是方法声明的泛型变量。返回的 ResponseEntity 中的响应体类型与 responseType 参数一致,实现类型安全。

例如:

markdown 复制代码
-   若 `responseType = String.class`,则返回 `ResponseEntity<String>`
-   若 `responseType = MyResponse.class`,则返回 `ResponseEntity<MyResponse>`

对比非泛型写法

若不使用泛型,可能需要这样写:

typescript 复制代码
public static ResponseEntity<?> send(...) { ... } 
// 或
public static ResponseEntity send(...) { ... }

但这样会失去类型信息,调用方需要手动向下转型,且无法保证类型安全。

为什么看起来很多泛型方法都是静态的?

  • 静态泛型方法:当你希望一个方法能够在不创建类的实例的情况下使用(即通过类名直接调用),你可以将这个方法定义为静态的。静态方法属于类本身而不是类的某个特定实例,因此它们不能访问实例变量或实例方法(除非通过一个类的实例)。 示例:

    typescript 复制代码
    java
    深色版本
    public class Utility {
        public static <T> void staticGenericMethod(T t) {
            // 方法体
        }
    }
  • 实例泛型方法:如果方法需要访问或修改类的实例状态(即实例变量),那么你应该将其定义为实例方法。 示例:

    csharp 复制代码
    java
    public class MyClass<T> {
        private T myField;
    
        public void instanceGenericMethod(T t) {
            this.myField = t;
        }
    }
相关推荐
闲猫4 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
葫芦和十三5 小时前
图解 MongoDB 28|块与迁移:balancer 怎么均衡数据
后端
葫芦和十三5 小时前
图解 MongoDB 27|分片策略:范围分片 vs 哈希分片
后端·mongodb·agent
paopaokaka_luck5 小时前
英语单词学习系统的设计与实现(基于艾宾浩斯遗忘曲线的智能复习机制、语音朗读、多题型测试与错题自动收录、Echarts图形化分析)
vue.js·spring boot·后端·echarts
自信的未来6 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
Brookty6 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全
我叫黑大帅6 小时前
MySQL 并发插入竞态问题:原子写入实践指南
后端·mysql·面试
怕孤单的草丛6 小时前
缓存管理面临的主要问题
java·数据库·缓存
zhangxingchao7 小时前
AI大模型核心八:从 Agent Skill、长文档 RAG 到知识库更新与训练策略
前端·人工智能·后端