Discuss / Java / 为什么要区分静态方法中的泛型呢

为什么要区分静态方法中的泛型呢

Topic source

如题,我不太明白为什么要区分开,而且为什么<K>要放在static后面而不是其他地方呢

浪过扬帆

#2 Created at ... [Delete] [Delete and Lock User]

这实际上和类型泛型擦除有关,你看了下一节就明白了。

因为普通的方法是通过类的实例来调用的,创建实例的过程调用了构造方法,也就是说对象已经知道这个时候类上面定义的<T>的具体类型了;

而静态方法不需要对象实例来调用,所以也就不知道<T>的具体类型,虚拟机不允许这种情况发生,所以编译的时候就报错了。

用个老师的例子:

Pair<String> p = new Pair<>("Hello", "world");  //创建实例时已经知道<T>是String类型
String first = p.getFirst();  
Pair.create(...);  //如果是静态方法,则并不清楚<T>的具体类型

<K>放在static后面,你可以理解为既然静态方法不知道Pair里面的具体类型,你就手动的告诉它具体的类型。

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

少凯7878

#5 Created at ... [Delete] [Delete and Lock User]

涨知识了

@浪过扬帆


  • 1

Reply