我已经安装了最新的 JDK 8 ea b114 来测试新的语言功能。 然而,链式调用中的推理似乎还不起作用。
如果我写:
Iterator<String> it = new ArrayList<>().iterator();
编译器给我一个错误。
然而,论据位置的推断效果很好。
可能不会插入链式调用中的推理?
最佳答案
正如@Holger 所说,Java 8 改进了上下文推理,因此它可以工作_
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 已经处于人类难以解析代码的危险水平。
关于Java 8 和广义目标类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934204/