【问题标题】:Why java allow to use formal type parameter in static Generic Method为什么java允许在静态泛型方法中使用形式类型参数
【发布时间】:2017-08-10 03:52:33
【问题描述】:

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

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
}

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

【问题讨论】:

  • 正式类型参数是泛型类型参数。我不明白你在问什么。
  • 请你用例子解释一下这个[问题]
  • 一个方法每次使用都会得到不同的类型参数;方法的一次调用与同一方法的另一次调用之间没有关系。对于字段,没有一个T 可以使用;对于方法,T 在方法调用处分配,在每个使用方法的地方分配一个不同的T。

标签: java generics


【解决方案1】:

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

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

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

public和static关键字后面的T是泛型方法的类型参数列表。这里你只有一个类型参数,T,但你可以有更多。泛型方法的类型参数列表总是出现在尖括号之间,并且应该跟在任何修饰符之后,例如 public 和 static,就像你在这里看到的一样,并且应该在返回类型之前。

考虑另一个代码sn-p,

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 子类的参数。这显然增加了使用泛型类对象的灵活性。在这种情况下,您无需更改方法的主体。只需通过定义方法参数的方式即可提供所有灵活性。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2019-02-14
    • 2016-07-12
    • 2010-09-16
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多