Java 类型参数确定的一般方法

Java 类型参数确定的一般方法,java,generics,Java,Generics,请考虑以下简单示例: public static void main(String[] args) throws FileNotFoundException, IOException { List<Integer> li = createList();//ok, this mean that ArrayList<Integer> was returned List<Double> ld = createList();//ok, ArrayLis

请考虑以下简单示例:

public static void main(String[] args) throws FileNotFoundException, IOException {
    List<Integer> li = createList();//ok, this mean that ArrayList<Integer> was returned
    List<Double> ld = createList();//ok, ArrayList<Double> was returned
}

public static <T> List<T> createList()
{
    return new ArrayList<T>();
}
publicstaticvoidmain(字符串[]args)抛出FileNotFoundException、IOException{
List li=createList();//好的,这意味着返回了ArrayList
List ld=createList();//确定,返回了ArrayList
}
公共静态列表createList()
{
返回新的ArrayList();
}

泛型方法中确定合适类型参数的算法是什么?如果您提供对
JLS

的参考,那就太好了。这是JLS关于泛型类型推断的章节: 请参见。Java编译器在调用泛型方法时查看目标类型以推断类型参数。通常,表达式的目标类型“是Java编译器期望的数据类型,具体取决于表达式出现的位置”。因此,在您的情况下,您有:

List<Integer> li = createList();

实际的算法非常复杂,JLS对此进行了详细介绍。

对不起,您想知道该语言用于使T工作的内部结构吗?@Leo我对实现细节不感兴趣。我想了解JLS中定义的形式化算法(如果有)。非常有趣。但是如果目标类型是通配符类型呢?在这种情况下推断的是什么类型?你的意思是如果你有
List li=createList()?是的,类似的。我想它也会做同样的事情。它将返回一个
ArrayList
实例。@DmitryFucintv当然,我今天晚些时候将尝试查找。我记不起头顶的确切部位了。我希望至少能弄清楚为什么推断类型不重要,只要它是有效的。
List<Integer> li = MyClass.<Integer>createList();