我有以下代码:package test;import java.util.stream.IntStream;public class A { public static void main(String[] args) { IntStream.range(0, 10).mapToObj(n -> new Object() { int i = n; }).mapToInt(o -> o.i).forEachOrdered(System.out::println); }}使用javac 1.8.0_101编译时,此代码可以正常工作,并按预期产生数字0到9。但是当我在eclipse中使用此代码时,它在o.i以下位置告诉我:i cannot be resolved or is not a field并在执行此操作时产生错误:Exception in thread "main" java.lang.Error: Unresolved compilation problem: i cannot be resolved or is not a field at test.A.main(A.java:9)为什么需要使用javac来编译此代码?而我该如何使日食表现得更好呢?
1 回答
MM们
TA贡献1886条经验 获得超2个赞
这是ecj中的错误,最近也报告为Bug 535969。
简而言之:为避免出现棘手的技术问题,编译器会在类型推断期间删除匿名类,并用其父类代替它(在特定情况下,并非总是如此)。这样,结果将mapToObj()
被视为Stream<Object>
确实应使用匿名类的地方。最初的评估认为此信息丢失是可以的(因为没有人可以提及匿名类),此问题中的示例证明这是错误的。
添加回答
举报
0/150
提交
取消