Java 方法上的类型变量

Java 方法上的类型变量,java,generics,Java,Generics,我对类型变量的概念有一定的理解,我可以采用不同的类型,但这两种方法的区别是什么: public static <T> List<T> toList(...); publicstaticlist-toList(…); 及 publicstaticlist-toList(…); 因为它们都返回类型T的列表。在第一种情况下,T是方法自己的类型参数,在第二种情况下,T是执行方法的泛型类的实例的类型参数值(在本例中,代码不会使用static修饰符进行编译)或已经存在的名为t的

我对类型变量的概念有一定的理解,我可以采用不同的类型,但这两种方法的区别是什么:

public static <T> List<T> toList(...);
publicstaticlist-toList(…);

publicstaticlist-toList(…);

因为它们都返回类型T的列表。

在第一种情况下,
T
是方法自己的类型参数,在第二种情况下,
T
是执行方法的泛型类的实例的类型参数值(在本例中,代码不会使用
static
修饰符进行编译)或已经存在的名为
t
的类/接口(在本例中,它在任何意义上都不是类型参数)。

在第一个示例中,您的意思是: 对于任何类型的
T
,此方法返回
T
s的列表

第二条只说: 此方法返回
T
s的列表

这里的区别是“For any…”子句(这是您在
static
之后添加的
)。如果范围中已经有一个名为
T
的类型,
T
将引用该类型;例如:

public class Something<T> {
    public List<T> doSomething() { ... }
}
定义了两种不同的
T
类型。例如,对
Something
调用
doSomething()
可以返回
List
(因为这两种类型变量不必相同)


需要考虑的另一件事是:如果存在
类T
列表将引用该类,而不是在没有
的情况下引用可能的类型变量。如果任何地方都没有
类T
,这将是一个错误(因为
T
必须在某个点引入“范围”).

在第二个示例中,是什么声明了类型
T
?(提示:没有,这就是它无法编译的原因)不同之处在于,第二个类不会编译,因为
t
未定义。您假设了一些不明显的东西:该类是泛型的,并定义了
t
。即使它是泛型的,这也是不正确的,因为问题中的方法是静态的。该类的泛型参数仅在实例范围内可用。@yshavit答案已经涵盖了问题的
static
方面。@PhilipVoronov不太清楚。您的语句“在第二种情况下,
T
是对其执行方法的泛型类实例的类型参数值”仍然假设拥有的类是通用的。问题中没有任何东西。@安德烈亚斯,我通过追加“或已经存在”来更新。只考虑代码如何根据不同的上下文来解释。“具体来说,这两个TS都指的是相同的精确类型。”不是。第一个是指类的类型参数;第二个是编译器错误,因为该方法是静态的。哎呀,当我试图显示不同的内容时,意外地留在了
static
中。对于
static
方法,主要区别在于
List
现在使用类型d定义在
类别T
中。
public class Something<T> {
    public List<T> doSomething() { ... }
}
public class Something<T> {
    public <T> List<T> doSomething() { ... }
}