为什么eclipse java编译器(ecj)不能编译这个?

Joh*_*uhn 10 java javac 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用javac 1.8.0_101编译时,此代码工作正常,并按预期生成数字0到9.

但是当我在Eclipse中使用这段代码时,它会告诉我o.i:

i cannot be resolved or is not a field
Run Code Online (Sandbox Code Playgroud)

执行此操作时产生错误:

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)
Run Code Online (Sandbox Code Playgroud)

为什么我需要使用javac来编译这段代码?

我如何让Eclipse表现出来?

编辑:

我做了一些测试,只要我不在lambda中创建实例,它就可以在ecj中工作:

package test;

import java.util.Optional;
import java.util.function.Supplier;

public class B {
    public static void main(String[] args) {

        // This works fine:
        System.out.println(new Object() {
            int j = 5;
        }.j);

        // This also
        System.out.println(trace(new Object() {
            int j = 5;
        }).j);

        // Also no problem
        System.out.println(unwrapAndTrace(Optional.of(new Object() {
            int j = 5;
        })).j);

        // Lambdas work:
        System.out.println(((Supplier & Serializable) () -> new Object()).get()); 

        // This doesn't work.
        System.out.println(invokeAndTrace(() -> new Object() {
            int j = 5;
        }).j);
    }

    public static <T> T trace(T obj) {
        System.out.println(obj);
        return obj;
    }

    public static <T> T invokeAndTrace(Supplier<T> supplier) {
        T result = supplier.get();
        System.out.println(result);
        return result;
    }

    public static <T> T unwrapAndTrace(Optional<T> optional) {
        T result = optional.get();
        System.out.println(result);
        return result;
    }    }
Run Code Online (Sandbox Code Playgroud)

Ste*_*ann 8

这是ecj中的一个错误,最近也报告为Bug 535969.

简而言之:避免硬技术问题,编译器类型推断期间下降匿名类,其超类替换它(在特定情况下,并不总是).有了这个,结果mapToObj()被视为Stream<Object>确实应该使用匿名类.原始评估,这个信息丢失是可以的(因为没有人可以提到匿名类)被证明在这个问题中的例子是错误的.

编辑:该错误已通过预先存在的报告错误477894修复