web-dev-qa-db-ja.com

特定の状況では、<R> map(Function <?super T ,? extends R>)の型引数を推測できません

ファイル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でコードがエラーなしでコンパイルされます。

なぜそのような行動があるのか​​誰もが知っていますか?バグですか?

Eclipse 4.6.2.20161208-0625を使用します(現時点では更新が見つかりません)。

10

これがバグであることを確認しました: https://bugs.Eclipse.org/bugs/show_bug.cgi?id=512486 。 4.6.3で解決済みとして宣言されています。安定版リリースが利用可能になったときにこれを確認します。

Eclipse IDE for Java Developers Version:Mars Release(4.5.0)Build id:20150621-1200で確認したところ、コードはうまく機能しました。 4.6バージョンで導入された可能性があります。

3
Pallavi Sonal