泛型类和泛型方法

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

泛型类

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

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;
        }
    }
相关推荐
sunbin17 分钟前
稀土掘金我要吐槽你
后端
程序员鱼皮2 小时前
我代表编程导航,向大家道歉!
前端·后端·程序员
间彧2 小时前
Spring Boot项目中如何实现Redis分布式锁
java
zjjuejin2 小时前
Maven 生命周期与插件机制
后端·maven
掘金安东尼2 小时前
AI 应用落地谈起 ,免费试用 Amazon Bedrock 的最佳时机
java·架构
阿杆2 小时前
为什么我建议你把自建 Redis 迁移到云上进行托管
redis·后端
杨杨杨大侠2 小时前
案例03-附件E-部署运维
java·docker·github
Java水解2 小时前
go语言教程(全网最全,持续更新补全)
后端·go
杨杨杨大侠2 小时前
案例03-附件B-映射器实现
java·开源·github
杨杨杨大侠2 小时前
案例03-附件A-订单实体设计
java·开源·github