Java 8 和广义目标类型推断

标签 java generics java-8

我已经安装了最新的 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/

相关文章:

Java 8 方法引用 : provide a Supplier capable of supplying a parameterized result

java - 如何计算2个Unix timeSpan差异。例如int结束时间=1213036458; int开始时间= 1211018446;

java - 如何编写一个程序来解决多个问题?

c# - 使用 EF6 为 CRUD 操作实现通用服务

c# - 有没有通用的方法来填充数据库中的对象?

java - 如何使用 groupBy 计算出现次数?

Java 8 兼容性问题 : How to convert Object array to Subtype List in Java 8?

java - 检查 Thymeleaf 页面中的对象上是否存在特定字段

java - invokeLater 与使用 JTextArea 的 invokeAndWait

c# - 使用另一个接口(interface)从一个接口(interface)实现泛型方法