xde*_*000 20 java generics java-8
我安装了最后一个JDK 8 ea b114来测试新的语言功能.然而,链式调用中的推断似乎还没有奏效.
如果我写:
Iterator<String> it = new ArrayList<>().iterator();
Run Code Online (Sandbox Code Playgroud)
编译器给我一个错误.
然而,论证位置的推论效果很好.
也许不会插入链式调用中的推断?
Zho*_*gYu 17
正如@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<>() );
\____________________________/
}
Run Code Online (Sandbox Code Playgroud)
它在Java 7中不起作用 - 推断new ArrayList<>()不能依赖于上下文.
在问题中做你想做的事情对语言来说是一个巨大的变化.John Rose开始了类似的讨论,请参阅 http://mail.openjdk.java.net/pipermail/lambda-dev/2013-July/010531.html
过多的推理和过多的上下文依赖可能是一件坏事.并不是说编译器无法处理复杂性 - 它可以.这是关于人类程序员是否能够处理它.我感觉Java 8已经处于危险的水平,人类难以解析代码.
Ben*_*ulz 13
最新规范(公共评论)可在jcp.org上获得.D部分有一段讨论这一点.
方法调用,字段访问等(exp.foo())中的接收器不是聚合表达式,因为目标类型是未知的 - 不可能枚举具有特定成员的每个类型(在这种情况下为foo) ).允许推理"链"有一些兴趣:在a().b()中,将类型信息从b的调用传递给a的调用.这为推理算法的复杂性增加了另一个维度,因为部分信息必须在两个方向上传递; 它只适用于a()的返回类型的擦除对于所有实例化(例如List)是固定的.此特征不适合多聚表达式模型,因为无法轻松导出目标类型.
| 归档时间: |
|
| 查看次数: |
3957 次 |
| 最近记录: |