泛型类和泛型方法

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

泛型类

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

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;
        }
    }
相关推荐
路边草随风1 小时前
java实现发布spark yarn作业
java·spark·yarn
为爱停留1 小时前
Spring AI实现MCP(Model Context Protocol)详解与实践
java·人工智能·spring
汝生淮南吾在北4 小时前
SpringBoot+Vue饭店点餐管理系统
java·vue.js·spring boot·毕业设计·毕设
无限大67 小时前
计算机十万个为什么--数据库索引
后端
冬夜戏雪8 小时前
【java学习日记】【2025.12.7】【7/60】
java·开发语言·学习
CC.GG8 小时前
【C++】二叉搜索树
java·c++·redis
学历真的很重要8 小时前
VsCode+Roo Code+Gemini 2.5 Pro+Gemini Balance AI辅助编程环境搭建(理论上通过多个Api Key负载均衡达到无限免费Gemini 2.5 Pro)
前端·人工智能·vscode·后端·语言模型·负载均衡·ai编程
JIngJaneIL9 小时前
基于Java非遗传承文化管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
+VX:Fegn08959 小时前
计算机毕业设计|基于springboot + vue心理健康管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
南部余额9 小时前
踩坑与解惑:深入理解 SpringBoot 自动配置原理与配置排除机制
java·spring boot·自动配置原理·import