static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
如果我正在引用String或任何其他类型。编译器抛出错误。
你能帮我理解为什么java推断它为Serializable?
a1
的论据,你传递"d"
类型的String
。a2
,你传递new ArrayList<String>()
类型的ArrayList<String>
最接近的String和ArrayList的常见超类型是Serializable
。如果你写了它也会工作:
Object s = pick("d", new ArrayList<String>());
在函数pick中,结果与参数a1和a2的类型相同。在第二行,Java编译器尝试推断参数a1和a2的公共类型T1。函数调用的结果将是T1类型。因此,a1具有类型String,而a2具有类型ArrayList。这两种类型都实现了Serializable接口。因此,T1将从Serializable继承,您可以在第二行开始时编写Serializable。你不能在那里写String,因为String不是String和ArrayList的常用超类型。