Java 8 和广义目标类型推理
我已经安装了最后一个JDK 8 ea b114来测试新的语言功能。然而,链式调用中的推理似乎还不起作用。
如果我写:
Iterator<String> it = new ArrayList<>().iterator();
编译器给我一个错误。
然而,论证位置的推理效果很好。
也许不会插入链式调用中的推理?
我已经安装了最后一个JDK 8 ea b114来测试新的语言功能。然而,链式调用中的推理似乎还不起作用。
如果我写:
Iterator<String> it = new ArrayList<>().iterator();
编译器给我一个错误。
然而,论证位置的推理效果很好。
也许不会插入链式调用中的推理?
正如@Holger所说,Java 8改进了上下文推理,因此这works_
public static <T> Iterator<T> iter(Iterable<T> i)
{
return i.iterator();
}
public static void main(String[] args)
{
Iterator<String> it = iter( new ArrayList<>() );
\____________________________/
}
它在Java 7中不起作用 - 推论不能依赖于上下文。new ArrayList<>()
这将是对语言的巨大变化,以做你在问题中想要的。约翰·罗斯(John Rose)也开始了类似的讨论,参见 http://mail.openjdk.java.net/pipermail/lambda-dev/2013-July/010531.html
太多的推断和太多的上下文依赖可能是一件坏事。与其说编译器无法处理复杂性,不如说它可以。这是关于人类程序员是否能够处理它。我感觉到Java 8已经处于一个危险的水平,人类很难解析代码。
最新规范(公共评论)可在 jcp.org 上获得。D部分有一段讨论了这一点。
方法调用、字段访问等(exp.foo())中的接收器不是多元表达式,因为目标类型是未知的 - 不可能枚举具有特定成员的每个类型(在本例中为 foo)。在允许推断“链”方面有一些兴趣:在a().b()中,将类型信息从b的调用传递到a的调用。这为推理算法的复杂性增加了另一个维度,因为部分信息必须在两个方向上传递;仅当所有实例化(例如 List)的返回类型被固定时,它才有效。此功能不能很好地适应 poly 表达式模型,因为目标类型不容易派生。