为什么隐式类型推断仅适用于赋值?

时间:2010-01-13 08:29:27

标签: java generics

我知道在赋值中使用泛型,方法可以通过查看左侧变量的类型来隐式地知道返回类型的类型。

Google Collection中的示例:

List<String> l = Lists.newArrayList()

我的问题是为什么它不能用于方法或更高类型的推理?

示例:

List<List<String>> ll = Lists.newArrayList();
ll.put(Lists.newArrayList()); // doesn't work

这是在JLS中指定的吗?如果是,为什么?如果不是,那么这是我对Java 7的一种改进吗?

这让我恼火,因为好像我在Java中有问题就像我很久以前在Delphi中遇到问题一样,我不能做链接方法调用:

C c = a.b().c();

在Delphi(IIRC)中,你必须这样做:

B b = a.b();
C c = b.c();

看起来像'dejavu'

1 个答案:

答案 0 :(得分:3)

我不想在这里声明特定的知识,但是在赋值给变量和使用值作为方法参数之间存在一个明显的区别:在前一种情况下只有一个可能的目标,方法是否过载。

基本上,这意味着您不必担心类型推断和重载/转换交互:仅在您知道您感兴趣的唯一目标类型的情况下才会发生推断 英寸

这个只是猜测。我总是发现Java的类型推断很有趣 - 它与C#3完全相反,在那里你可以推断变量的类型(只要它是一个局部变量)。

编辑:我相信相关的JLS section is 15.12.2.8

  

如果方法结果发生在   将受其影响的背景   赋值转换(第5.2节)到一个类型   S,然后让R成为声明的结果   方法的类型[...]

基本上它是“赋值转换”位,这很重要。