2012-08-15 161 views
1

Sun Tutorials for genericsJava泛型和类型推断

类型推断

为了说明这最后一点,在下面的例子中,推理 确定第二个参数被传递到拾取方法的类型为 字符串:

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

Origirally我认为我dea就是你可以使用任何参数代替T,只要它以String结尾。例如ArrayList<ArrayList<String>>

但后来我发现下面还有编译罚款:
Serializable s = pick("d", new ArrayList<Integer>());
似乎T推断是一个Serializable而不是String

那么什么是语句的含义

推理判断的第二个参数传递给挑 方法String类型的

+0

它看起来像一个错字。 – assylias 2012-08-15 11:07:53

+0

@assylias:最普遍的形式应该是感染,对吧? – Cratylus 2012-08-15 11:09:01

回答

2

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

  • Serializable不延长任何
  • String实现Serializable其他无关的东西
  • ArrayList<String>实现Serializable其他无关的东西

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

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

+0

1)你的意思是'ArrayList '是否实现'Serializable'?2)最具体还是最通用的类​​型? – Cratylus 2012-08-15 11:15:30

+0

1)是ArrayList 实现Serializable 2)适用于所有的最具体3.在你的情况,所有三种类型也是对象,但Serializable比对象更具体,所以这就是选择。 – assylias 2012-08-15 11:19:05

+0

如果我改成:'String s = pick(“d”,new ArrayList ());'它也不能编译。但是这种情况并不清楚为什么。它说:'不能从Serializable转换为String'。它是如何从此推断出'Serializable'的呢?全部都是'String's – Cratylus 2012-08-15 11:23:07