何时在泛型方法声明中使用<t> </t>

时间:2014-02-02 14:53:30

标签: java generics methods

这有什么区别:

T getById(Integer id);

而且:

<T> T getById(Integer id);

他们不是都返回类型T的类吗?

4 个答案:

答案 0 :(得分:8)

在第一个片段中,T指的是类'类型参数列表中声明的类型变量。

在第二个片段中,您将创建一个新的类型变量T(可能会影响第一类),在方法参数列表中声明。

答案 1 :(得分:7)

是的,但您必须在某处声明T。你做了什么改变。

  • 在第一种情况下,T是在类级别定义的,因此您的方法是泛型类的一部分,并且在声明/实例化时您必须专门化该类。 T对于类中的所有方法和属性都是相同的。
  • 在第二个中,T是在方法级别定义的,因此它是一个通用方法。 T的价值可以(通常)推断出来。

在第一种情况下,T的范围是整个类,而第二种情况只是方法。

第二种形式通常用于静态方法。此外,后者的优点是可以推导出类型变量T(在大多数情况下你不必指定它),而你必须为前者指定它。

具体而言,如果某些属性取决于T(类型为TList<T>等),则必须使用泛型类。

答案 2 :(得分:7)

第一个返回封闭泛型类型的类型T.例如,

T get(int index);
在类List<T>中声明的

List<T>的给定索引处返回类型为T的元素。

第二个声明方法本身是一个泛型方法,其返回类型取决于它被调用的方式。如果您将其作为

调用
String s = theObject.<String>getById(id);

它将返回一个String。如果您将其作为

调用
Foo f = theObject.<Foo>getById(id);

它会返回一个Foo。大多数情况下,泛型类型是由编译器自动推断的,因此您只需编写

即可
Foo f = theObject.getById(id);

有关具体示例,请参阅

static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)

返回T的集合中T类型的最大元素。方法返回的类型取决于传递给方法的集合的类型。

答案 3 :(得分:2)

其他答案在使用时解释得很好,我提供了一个例子

对于第1点

class ArrayList<E> {//implementing and extending
   public E get(int index) {
   }
}

对于第2点:静态实用方法

public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);
}