Não é possível inferir argumento (s) de tipo para o mapa <R> (Função <? Super T ,? estende R>) em alguma situação específica
Eu tenho as seguintes classes em um arquivo 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);
}
}
a compilação no Eclipse mostra erro na linha 14 "Não é possível inferir argumentos do tipo para mapa (Função)".
O mesmo código é compilado sem problemas usando javac puro (JDK 1.8.0_121).
Se eu mudar a linha apropriada para:
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());
então o código compila sem erro no Eclipse.
Alguém sabe por que existe esse comportamento? Isso é um bug?
Eu uso o Eclipse 4.6.2.20161208-0625 (não encontra atualizações no momento).