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() { ... }
}