泛型类和泛型方法

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

泛型类

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

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 天前
DDD 系列:DTO、VO、DO、Entity 怎么区分
java·ddd·领域驱动设计
Patrick_Wilson1 天前
为什么让程序主动崩溃反而更可靠?聊聊 supervisor 与 let it crash
后端·erlang·elixir
自由随风飘1 天前
JAVA中的面向对象-3
java·开发语言
桐薇全肯定1 天前
MySQL学生成绩管理系统实战操作
java·数据库·sql
武子康1 天前
权重已到、Recipe 还在变:Kimi K3 发布后该怎样做工程验收
人工智能·后端·agent
Nuanyt1 天前
SSM 学习记录 第二部分 Spring整合Mybatis&Junit AOP核心概念 Spring事务管理 SpringMVC 请求与响应 Rest风格
java·spring·junit·mybatis·restful
站大爷IP1 天前
列表推导式一用就爽?大数据量下它把我服务器内存榨干了,原来生成器才是yyds
后端
Slice_cy1 天前
Mint 自研框架设计与实现:从重复开发走向配置驱动(二)
前端·后端·架构
程序员cxuan1 天前
OpenAI 把 Hugging Face 打穿了,然后 GLM 5.2 当了救火队长?
人工智能·后端·程序员