【问题标题】:Cannot infer type argument(s) for <R> map(Function<? super T,? extends R>) in some specific situation在某些特定情况下无法推断 <R> map(Function<? super T,? extends R>) 的类型参数
【发布时间】:2017-07-06 05:43:15
【问题描述】:

我在文件 Sandbox.java 中有以下类:

package sandbox;

import java.util.Arrays;
import java.util.Collection;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;

public class Sandbox {

    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Collection<String> s = Arrays.asList(1,2,4,100).stream()
                .map(i -> CompletableFuture
                        .supplyAsync(() -> Wrapper.of(i), executor)
                        .thenApply(d -> d.get().toString())
                        )
                .map(CompletableFuture::join)
                .collect(Collectors.toList());

        executor.shutdown();

        System.out.println(s);
    }
}

class Wrapper<T> {
    T t;

    private Wrapper(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }

    public static <T> Wrapper<T> of (T t) {
        return new Wrapper<>(t);
    }
}

Eclipse 中的编译在第 14 行“无法推断 map(Function) 的类型参数”中显示错误。

使用纯 javac (JDK 1.8.0_121) 编译相同的代码没有问题。

如果我将正确的行改为:

Collection<String> s = Arrays.asList(1,2,4,100).stream()
                .map(i -> CompletableFuture
                        .supplyAsync(() -> Wrapper.of(i), executor)
                        .<String>thenApply(d -> d.get().toString())
                        )
                .map(CompletableFuture::join)
                .collect(Collectors.toList());

然后代码在 Eclipse 中编译没有错误。

有谁知道为什么会有这样的行为?是bug吗?

我使用的是 Eclipse 4.6.2.20161208-0625(目前没有发现更新)。

【问题讨论】:

  • 您是否通过 Eclipse 使用具有相同合规性标志的相同版本的 java 编译器?我有时会发现 Eclipse 使用了一些意想不到的东西,这取决于项目的设置方式。
  • 你是指源层和目标层吗?在这两种情况下,它都是 1.8。我使用在 Eclipse 中配置的编译器实例,而不是使用纯 javac。所以我认为这是 JDT 的问题。
  • schmosel,是的,很可能是同样的问题。但不幸的是,也没有解决方案。
  • 我知道有一些 Java 1.8 版本存在这个问题(1.8.0_25 或 1.8.0_45 - 不记得是哪个)。此代码在 1.8.0_111 上编译并运行良好。

标签: java eclipse compiler-errors eclipse-neon


【解决方案1】:

我已经确认这是一个错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=512486。它已在 4.6.3 中声明为已解决。当稳定版本可用时,我会确认这一点。

【讨论】:

    【解决方案2】:

    我刚刚检查了 Eclipse IDE for Java Developers 版本:Mars Release (4.5.0) 内部版本号:20150621-1200,代码对我来说效果很好。 4.6版本可能已经引入。

    【讨论】:

    • 谢谢。事实上,它很可能在 4.6.1 中引入。
    【解决方案3】:

    当其中一个参数的类型错误时,我收到此错误。更正使错误消失的原因

    【讨论】:

      【解决方案4】:

      我最近在 Windows 10 上安装了 STS 4.6.2,虽然这些项目在我的构建路径上链接到 JDK 11(项目要求),但 IDE 本身无法正确设置它,所以我强制它,通过更改SpringToolSuite4.ini,在-vmargs 行之前添加带有java 路径的-vm 行,如下所示:

      -vm
      C:\Program Files\Java\jdk-11.0.6\bin\javaw.exe
      -vmargs
      ...
      

      ps:我意识到这可能是由于一些 java 路径问题,在环境变量上下文之外,我无法弄清楚如何解决 STS 的情况,但在 Eclipse 上没有发生。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多