Java泛型和类型推断

时间:2012-08-15 11:03:29

标签: java generics

来自Sun Tutorials for generics

类型推断

  

为了说明这最后一点,在下面的例子中,推断   确定传递给pick方法的第二个参数是   String类型:

static <T> T pick(T a1, T a2) { return a2; }  
Serializable s = pick("d", new ArrayList<String>());

原始我认为,只要最终使用T,您就可以使用任何参数代替String。示例ArrayList<ArrayList<String>>

但后来我看到以下内容也编得很好:
Serializable s = pick("d", new ArrayList<Integer>());
似乎T被推断为Serializable而不是String

那么声明是什么意思

  

推断确定传递给pick的第二个参数   方法是String类型的

1 个答案:

答案 0 :(得分:2)

在这种情况下,3种类型为SerializableStringArrayList<String>

  • Serializable不会延伸任何内容
  • String实施Serializable和其他无关的内容
  • ArrayList<String>实施Serializable和其他无关的内容

因此,适用于所有3的最具体类型是Serializable

例如,如果用Serializable s = pick("d", new Object());替换调用,则它不再编译,因为最具体的类型现在是Object,并且您无法将Object强制转换为Serializable。