1

来自Sun 泛型教程

类型推断

为了说明最后一点,在以下示例中,推理确定传递给 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推断为 aSerializable而不是 a String

那么声明的意义是什么

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

4

1 回答 1

2

在这种情况下,3 种类型是Serializable, String, ArrayList<String>

  • Serializable不扩展任何东西
  • String工具Serializable和其他不相关的东西
  • ArrayList<String>工具Serializable和其他不相关的东西

所以适用于所有 3 的最具体的类型是Serializable.

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

于 2012-08-15T11:13:01.250 回答