首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么eclipse编译器(ecj)不能编译这个呢?

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

Stack Overflow用户
提问于 2018-06-23 01:12:08
回答 1查看 1K关注 0票数 10

我有以下代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
i cannot be resolved or is not a field

并在执行以下操作时产生错误:

代码语言:javascript
复制
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来编译这段代码?

我怎么才能让eclipse表现出来呢?

编辑

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

代码语言:javascript
复制
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;
    }


}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-23 13:42:13

这是ecj中的一个bug,最近也被报道为Bug 535969

简而言之:为了避免技术难题,编译器在类型推断期间删除匿名类,代之以它的超类(在特定情况下,并不总是如此)。这样,mapToObj()的结果就被看作是Stream<Object>,实际上应该使用匿名类。最初的评估,认为这种信息丢失是可以的(因为没有人可以提到匿名类)被这个问题的例子证明是错误的。

编辑:该错误已通过现有的报表Bug 477894修复。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50997150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档