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
的参考资料,那将是件好事。
答案 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