泛型类和泛型方法

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

泛型类

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

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;
        }
    }
相关推荐
杨杨杨大侠7 分钟前
第8篇:Spring Boot集成 - 开发自己的Starter
java·spring·开源
赵得C30 分钟前
Java 多线程环境下的全局变量缓存实践指南
java·开发语言·后端·spring·缓存
Aeside11 小时前
漫谈代理模式,静态代理到 JDK 和 CGLIB 动态代理
java·设计模式
我梦见我梦见我1 小时前
一文看懂Spring MCP 的请求链路
java·mcp
打不过快跑1 小时前
YOLO 入门实战(二):用自定义数据训练你的第一个检测模型
人工智能·后端·python
敲代码的火锅1 小时前
基于pyroscope-go项目性能数据持续收集
后端·go
waynaqua1 小时前
最强工具库 Hutool,使用教程(含 Hutool-AI 使用讲解)
java
码事漫谈1 小时前
VS Code C#调试完全指南
后端
用户49055816081251 小时前
云原生系统如何实现“无状态会话”
后端
用户49055816081251 小时前
会话同步是数据面做,还是控制面做
后端