在方法上键入变量

时间:2016-10-11 19:58:54

标签: java generics

我理解类型变量的概念到某一点,我可以采用一种变化的类型,但这两种方法之间有什么区别:

public static <T> List<T> toList(...);

public static List<T> toList(...);

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

2 个答案:

答案 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 TList<T>会引用那个,而不是可能的类型变量,如果你没有<T> 。如果任何地方都没有class T且没有<T>,那么这将是一个错误(因为T必须引入&#34;范围&#34;在某些时候)。