通用方法TypeParameter确定

时间:2014-07-23 17:17:27

标签: java generics

Conssider以下简单示例:

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>();
}

通用方法中确定合适类型参数的算法是什么?如果您提供JLS的参考资料,那将是件好事。

2 个答案:

答案 0 :(得分:1)

Type Inference。 Java编译器在调用泛型方法时查看目标类型以推断类型参数。通常,表达式的目标类型“是Java编译器根据表达式出现的位置所期望的数据类型”。所以在你的情况下你有:

List<Integer> li = createList();

此处,目标类型为List<Integer>,通用参数为Integer。由于createList方法的返回值类型为List<T>,因此编译器可以推断泛型类型参数T必须为Integer。您也可以通过使用类型见证来使其更加明确:

List<Integer> li = MyClass.<Integer>createList();

实际算法非常复杂,JLS在section 15.12.2.7中完成了它。

答案 1 :(得分:0)

以下是关于泛型类型推断的JLS章节: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7