怎么知道JVM没有参数的泛型类型参数?

时间:2013-09-05 23:46:31

标签: java generics

我有一个泛型工厂方法。

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
}

2 个答案:

答案 0 :(得分:6)

由于类型擦除,JVM不知道泛型类型参数。

Java编译器能够推断出示例中T应该是IntegerString,因为它可以访问有关变量类型的泛型类型信息声明。

答案 1 :(得分:1)

一种观点是,当未明确给出通用参数时,推断出它。通常,它是从参数推断出来的,但是当没有参数时,在有限的情况下(例如变量声明),它可以从左侧推断出来。

另一种观点是,当没有明确给出泛型参数时,编译器并不真正关心参数究竟是什么。毕竟,type参数根本不会影响编译的字节码。它只需要能够证明存在一些可以使其工作的类型参数;它不再关心了。某种情况可能有多个有效的类型参数;但它并不关心哪一个被“使用”,因为它对结果没有影响。在这种情况下,由于该方法不带参数并返回List<T>,其中T是该方法的泛型,只要它在一个带List的上下文中使用,它就是有效,因为无论需要List<what exactly>,都存在有效TT = whatever type parameter is desired)。因此,在这种情况下,编译器实际上根本不需要检查类型参数。