为什么 Java 的泛型类型不能用于静态方法?

Java中的泛型类型为什么不能用于静态方法

来看个例子:

class Pair<T> {
    private T first;
    private T last;
    public Pair(T first, T last) {
        this.first = first;
        this.last = last;
    }
    public T getFirst() { return this.first; }
    public T getLast() { return this.last; }

    // 对静态方法使用<T>:
    public static Pair<T> create(T first, T last) {
        return new Pair<T>(first, last);
    }
}

如果在static方法中写泛型,那么编译器会报错。这是因为普通的方法是通过类的实例来调用的,也就是方法必须创建一个实例出来才能调用(也就是new),在创建实例的时候会调用实例的构造方法,这时候创建的实例就能知道这个类上面定义的类型了。

而静态方法呢,不需要创建一个实例就能调用,不创建实例也就没有调用构造方法,那么创建出来的实例就无法 get 到这个类的类型,因此相当于盲人摸象。

看下面的定义:

Pair<String> p = new Pair<>("Hello", "world");  //创建实例时已经知道<T>是String类型
String first = p.getFirst();  

Pair.create(...);  //如果 create 是类 Pair 的静态方法,则并不清楚<T>的具体类型

Pair<String> p = new Pair<>("Hello", "world");  //创建实例时已经知道<T>是String类型
String first = p.getFirst();  

Pair.create(...);  //如果 create 是类 Pair 的静态方法,则并不清楚<T>的具体类型

总结:静态方法由于随着类的加载而加载,不能访问类的泛型(因为在创建对象的时候才确定),因此必须定义自己的泛型类型。

那么怎么让泛型类型适用于静态方法呢?

// 静态 create 泛型方法
public static <T> Pair<T> create(T first, T last) {
    return new Pair<T>(first, last);
}

上面,在 static 后面也加上编译器就不会报错了,但实际上这个和Pair类型的已经没有任何关系了。

将静态方法的泛型类型和实例类型的泛型类型区分开:

// 静态 create 泛型方法
// 要这样,K不与类定义的<T>冲突
public static <K> Pair<K> create(K first, K last) {
    return new Pair<K>(first, last);
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值