泛型编程允许你编写与类型无关的代码,这意味着你可以编写能够处理多种类型的类和方法,而无需为每种类型编写单独的实现。这不仅提高了代码的复用性,还增强了类型安全性。
泛型类
泛型类是在实例化时接收一个或多个类型的类。定义泛型类的基本语法如下:
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(...) { ... }
但这样会失去类型信息,调用方需要手动向下转型,且无法保证类型安全。
为什么看起来很多泛型方法都是静态的?
-
静态泛型方法:当你希望一个方法能够在不创建类的实例的情况下使用(即通过类名直接调用),你可以将这个方法定义为静态的。静态方法属于类本身而不是类的某个特定实例,因此它们不能访问实例变量或实例方法(除非通过一个类的实例)。 示例:
typescriptjava 深色版本 public class Utility { public static <T> void staticGenericMethod(T t) { // 方法体 } }
-
实例泛型方法:如果方法需要访问或修改类的实例状态(即实例变量),那么你应该将其定义为实例方法。 示例:
csharpjava public class MyClass<T> { private T myField; public void instanceGenericMethod(T t) { this.myField = t; } }