为什么java允许在静态通用方法中使用形式类型参数

时间:2017-08-10 03:52:34

标签: java generics

我知道我不能在泛型类的任何静态上下文中使用类型参数,因为“静态上下文依赖于类型参数,对于泛型类型的所有实例化只有一次。”

public final class X<T>{
    private static T field; // error
    public static T getField(){return field; } // error
}

但我不明白为什么允许在静态泛型方法中使用形式类型参数。

public final class X{
    public static <T> T getField(T t){ return t;} // Ok
}

静态通用方法中泛型类型参数和形式类型参数有什么区别? 请你用实例解释一下吗? 非常感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用自己独立的一个或多个类型参数来定义方法,在这种情况下,您有一个参数化方法,也称为通用方法。您可以在普通类中使用参数化方法。泛型类型定义中的方法也可以具有独立的参数。

您可以修改listAll()方法,即参数化方法。这是看起来的样子:

public static <T> void listAll(LinkedList<T> list) 
{ 
for(T obj : list) 
{
 System.out.println(obj); 
} 
}

公共静态关键字后面的 T 是泛型方法的类型参数列表。这里只有一个类型参数 T ,但您可以拥有更多。泛型方法的类型参数列表始终显示在有角度的括号之间,并且应该遵循任何修饰符,例如 public static ,就像您在此处一样,并且应该在返回类型之前。

考虑另一个代码段,

public <E extends T> void add(E value) 
{ 
if(root == null) { // If there’s no root node 
 root = new Node(value);          // store it in the root 
}  
else {    // Otherwise... 
add(value, root);  // add it recursively
 } 
}

您还可以通过使用参数化方法获得一些优势。现在该方法有一个独立的参数 E add()方法接受类型 T 的参数,这是类型参数。通常,您可能希望允许添加 T 的子类。 add()方法接受任何类型为 T 的类型的参数,或 T 的子类。这显然增加了使用泛型类对象的灵活性。在这种情况下,您无需更改方法的主体。只需通过定义方法参数的方式提供所有灵活性。

我希望我的回答对你有所帮助。