我理解类型变量的概念到某一点,我可以采用一种变化的类型,但这两种方法之间有什么区别:
public static <T> List<T> toList(...);
和
public static List<T> toList(...);
因为它们都返回类型为T的列表。
答案 0 :(得分:1)
在第一种情况下,T
是方法自己的类型参数,在第二种情况下,T
是实例<的类型参数值 / strong>执行该方法的泛型类(在这种情况下,代码不会使用static
修饰符编译)或已存在的类/接口名称为{{1} (在这种情况下,它在任何情况下都不是一个类型参数)。
答案 1 :(得分:1)
在第一个例子中,您说:
对于任何类型T
,此方法返回T
s。列表。
第二个只说:
此方法返回T
s。列表。
这里的区别是&#34;对于任何......&#34;子句(在<T>
之后添加的static
)。如果您已在范围内使用名为T
的类型,则T
会引用该类型;例如:
public class Something<T> {
public List<T> doSomething() { ... }
}
这意味着Something<T>
会返回List<T>
。具体来说,这两个T
都指的是相同的确切类型,因此Something<Integer>
会为您提供List<Integer>
。但是,如果您将其更改为:
public class Something<T> {
public <T> List<T> doSomething() { ... }
}
定义了两种不同的T
类型。例如,在doSomething()
上调用Something<Integer>
可能会返回List<Random>
(因为这两个类型变量不必相同)。
另一件需要考虑的事情:如果你没有class T
,List<T>
会引用那个,而不是可能的类型变量,如果你没有<T>
。如果任何地方都没有class T
且没有<T>
,那么这将是一个错误(因为T
必须引入&#34;范围&#34;在某些时候)。