我知道在赋值中使用泛型,方法可以通过查看左侧变量的类型来隐式地知道返回类型的类型。
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'
答案 0 :(得分:3)
我不想在这里声明特定的知识,但是在赋值给变量和使用值作为方法参数之间存在一个明显的区别:在前一种情况下只有一个可能的目标,方法是否过载。
基本上,这意味着您不必担心类型推断和重载/转换交互:仅在您知道您感兴趣的唯一目标类型的情况下才会发生推断 英寸
这个只是猜测。我总是发现Java的类型推断很有趣 - 它与C#3完全相反,在那里你可以推断变量的类型(只要它是一个局部变量)。
编辑:我相信相关的JLS section is 15.12.2.8:
如果方法结果发生在 将受其影响的背景 赋值转换(第5.2节)到一个类型 S,然后让R成为声明的结果 方法的类型[...]
基本上它是“赋值转换”位,这很重要。