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

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

来自Google Collection的示例:

List l = Lists.newArrayList() 

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

例:

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

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

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

 C c = ab().c(); 

在Delphi(IIRC)中,您必须:

 B b = ab(); C c = bc(); 

看起来像’dejavu’

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

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

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

编辑:我相信相关的JLS部分是15.12.2.8 :

如果方法结果发生在它将受到赋值转换(第5.2节)到类型S的上下文中,那么让R成为方法的声明结果类型[…]

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