我知道我不能在泛型类的任何静态上下文中使用类型参数,因为“静态上下文依赖于类型参数,对于泛型类型的所有实例化只有一次。”
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
}
静态通用方法中泛型类型参数和形式类型参数有什么区别? 请你用实例解释一下吗? 非常感谢。
答案 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 的子类。这显然增加了使用泛型类对象的灵活性。在这种情况下,您无需更改方法的主体。只需通过定义方法参数的方式提供所有灵活性。
我希望我的回答对你有所帮助。