为什么Eclipse Java编译器(ecj)不能编译此文件?

我有以下代码:


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来编译此代码?

而我该如何使日食表现得更好呢?


慕森王
浏览 211回答 1
1回答

MM们

这是ecj中的错误,最近也报告为Bug 535969。简而言之:为避免出现棘手的技术问题,编译器会在类型推断期间删除匿名类,并用其父类代替它(在特定情况下,并非总是如此)。这样,结果将mapToObj()被视为Stream<Object>确实应使用匿名类的地方。最初的评估认为此信息丢失是可以的(因为没有人可以提及匿名类),此问题中的示例证明这是错误的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java