缘由 :

同事问 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> 声明新的泛型
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐