1

我有一个泛型工厂方法。

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
}
4

2 回答 2

6

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

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

于 2013-09-05T23:49:06.823 回答
1

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

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

于 2013-09-06T08:55:37.417 回答