Java 8和广义目标类型推断

我安装了最后一个JDK 8 ea b114来测试新的语言function。 然而,链式调用中的推断似乎还不起作用。

如果我写:

Iterator it = new ArrayList().iterator(); 

编译器给我一个错误。

然而,论证位置的推断效果很好。

也许不会插入链式调用中的推断?

最新规范(公共评论)可在jcp.org上获得 。 D部分有一段讨论这一点。

方法调用,字段访问等中的接收器(exp.foo())不是poly表达式,因为目标类型是未知的 – 不可能枚举具有特定成员的每个类型(在这种情况下为foo) )。 允许推断“链”有一些兴趣:在a()。b()中,将类型信息从b的调用传递给a的调用。 这为推理算法的复杂性增加了另一个维度,因为部分信息必须在两个方向上传递; 它只适用于a()的返回类型的擦除对于所有实例化(例如List)是固定的。 此特征不适合多聚表达模型,因为不能轻易导出目标类型。

正如@Holger所说,Java8改进了上下文推理,因此可行

 public static  Iterator iter(Iterable i) { return i.iterator(); } public static void main(String[] args) { Iterator it = iter( new ArrayList<>() ); \____________________________/ } 

它在Java7中不起作用 – 对new ArrayList<>()的推断不能依赖于上下文。


在问题中做你想做的事情对语言来说是一个巨大的变化。 John Rose开始了类似的讨论,请参阅http://mail.openjdk.java.net/pipermail/lambda-dev/2013-July/010531.html


过多的推理和过多的上下文依赖可能是一件坏事。 并不是说编译器无法处理复杂性 – 它可以。 这是关于人类程序员是否可以处理它。 我感觉Java8已经处于危险的水平,人类难以解析代码。