我有一个泛型工厂方法。
public static <T> List<T> create(){
return new ArrayList<T>();
}
但它没有参数/参数。
我没有为函数提供类型参数,但它知道没有任何参数的相应类型。
public static void main(String[] args){
List<Integer> intlist = create(); //it is an Integer List
List<String> stringlist = create(); //it is a String List
}
答案 0 :(得分:6)
由于类型擦除,JVM不知道泛型类型参数。
Java编译器能够推断出示例中T
应该是Integer
或String
,因为它可以访问有关变量类型的泛型类型信息声明。
答案 1 :(得分:1)
一种观点是,当未明确给出通用参数时,推断出它。通常,它是从参数推断出来的,但是当没有参数时,在有限的情况下(例如变量声明),它可以从左侧推断出来。
另一种观点是,当没有明确给出泛型参数时,编译器并不真正关心参数究竟是什么。毕竟,type参数根本不会影响编译的字节码。它只需要能够证明存在一些可以使其工作的类型参数;它不再关心了。某种情况可能有多个有效的类型参数;但它并不关心哪一个被“使用”,因为它对结果没有影响。在这种情况下,由于该方法不带参数并返回List<T>
,其中T
是该方法的泛型,只要它在一个带List
的上下文中使用,它就是有效,因为无论需要List<what exactly>
,都存在有效T
(T
= whatever type parameter is desired
)。因此,在这种情况下,编译器实际上根本不需要检查类型参数。