类型推断
为了说明这最后一点,在下面的例子中,推断 确定传递给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类型的
答案 0 :(得分:2)
在这种情况下,3种类型为Serializable
,String
,ArrayList<String>
。
Serializable
不会延伸任何内容String
实施Serializable
和其他无关的内容ArrayList<String>
实施Serializable
和其他无关的内容因此,适用于所有3的最具体类型是Serializable
。
例如,如果用Serializable s = pick("d", new Object());
替换调用,则它不再编译,因为最具体的类型现在是Object,并且您无法将Object强制转换为Serializable。