Java void 关键字前什么时候可以加泛型 <T>
·
缘由 :
同事问 void 方法前加泛型意义,为什么有时候可以加,有时候就不允许加呢?
答 :
void 方法前加 <T> 泛型的时机
✅ 正确场景示例
// 方法有自己独立的泛型需求(与类的泛型无关)
public class LocalKit {
// 类上没泛型,方法需要泛型
public <T> void handle(List<T> list) {
for (T item : list) {
doHandle(item);
}
}
}
// 方法上泛型与类泛型不同
public class ConvertKit<T> {
private T value;
// 方法需要另一个泛型 U
public <U> void doconvert(Function<U, T> converter, U i) {
this.value = converter.apply(i);
}
}
// 静态方法
public class LocalKit <T> {
// 静态方法不能访问类的泛型 T,必须自己搞
public static <U> void log(U item) {
log.info(item);
}
}
// 泛型约束与类不同
public class DataProcessor<T extends Number> {
// 类的 T 必须是 Number
// 但方法需要处理 String,且返回类型与输入有关
public <SR extends CharSequence> void process(SR data) {
System.out.println(data.length());
}
}
❌ 错误场景:遮蔽类的泛型
// 1. 重复声明类的泛型(你的代码就是这个问题)
public abstract class AbstractOrderRangeHandle<T extends RangeModel> {
// ❌ 错误:这个 <T> 遮蔽了类的 T
public <T> void handle(T t) {
range(t); // 编译错误
}
public abstract Object range(T mode);
}
// 2. 没有必要的泛型声明
public class UserService<T> {
// ❌ 错误:直接使用类的 T 即可,不需要重新声明
public <T> void save(T entity) {
// ...
}
// ✅ 正确:使用类的泛型
public void save(T entity) {
// ...
}
}
📋 判断规则
| 场景 | 是否加 <T> |
示例 |
|---|---|---|
| 方法需要使用类定义的泛型 | ❌ 不加 | public void handle(T t) |
| 方法需要新的泛型参数 | ✅ 加 | public <U> void convert(U input) |
| 静态方法需要泛型 | ✅ 必须加 | public static <T> T create() |
| 方法的泛型约束与类不同 | ✅ 加 | public <S extends String> void process(S s) |
| 方法参数使用了类泛型之外的类型 | ✅ 加 | public <R> R transform(Function<T, R> f) |
🎯 判断技巧
问自己:这个方法需要的泛型,是类已经提供的吗?
- 是 → 不要加
<T>,直接用 - 否 → 需要加
<T>声明新的泛型
更多推荐




所有评论(0)