这有什么区别:
T getById(Integer id);
而且:
<T> T getById(Integer id);
他们不是都返回类型T
的类吗?
答案 0 :(得分:8)
在第一个片段中,T
指的是类'类型参数列表中声明的类型变量。
在第二个片段中,您将创建一个新的类型变量T
(可能会影响第一类),在方法参数列表中声明。
答案 1 :(得分:7)
是的,但您必须在某处声明T
。你做了什么改变。
T
是在类级别定义的,因此您的方法是泛型类的一部分,并且在声明/实例化时您必须专门化该类。 T
对于类中的所有方法和属性都是相同的。T
是在方法级别定义的,因此它是一个通用方法。 T
的价值可以(通常)推断出来。在第一种情况下,T
的范围是整个类,而第二种情况只是方法。
第二种形式通常用于静态方法。此外,后者的优点是可以推导出类型变量T
(在大多数情况下你不必指定它),而你必须为前者指定它。
具体而言,如果某些属性取决于T
(类型为T
,List<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);
}