在某些特定情况下无法推断 <R> map(Function<? super T,? extends R>) 的类型参数
Cannot infer type argument(s) for <R> map(Function<? super T,? extends R>) in some specific situation
我在文件 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 行显示错误 "Cannot infer type argument(s) for 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 中编译没有错误。
有谁知道为什么会有这样的行为?这是一个错误吗?
我用的是Eclipse 4.6.2.20161208-0625(暂时没有更新)
我刚刚使用 Eclipse IDE 检查了 Java 开发人员版本:Mars Release (4.5.0)
Build id:20150621-1200 代码对我来说效果很好。可能是4.6版本引入的
我已经确认,这是一个错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=512486。它已在 4.6.3 中声明为已解决。当稳定版本可用时,我会确认这一点。
当其中一个参数的类型错误时出现此错误。更正使错误消失
我最近在 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 上并没有发生。
我在文件 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 行显示错误 "Cannot infer type argument(s) for 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 中编译没有错误。
有谁知道为什么会有这样的行为?这是一个错误吗?
我用的是Eclipse 4.6.2.20161208-0625(暂时没有更新)
我刚刚使用 Eclipse IDE 检查了 Java 开发人员版本:Mars Release (4.5.0) Build id:20150621-1200 代码对我来说效果很好。可能是4.6版本引入的
我已经确认,这是一个错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=512486。它已在 4.6.3 中声明为已解决。当稳定版本可用时,我会确认这一点。
当其中一个参数的类型错误时出现此错误。更正使错误消失
我最近在 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 上并没有发生。