3

以下の標準 Java ストリームの場合、StreamEx よりも変数の型を「計算」する方が適切であることに気付きました。これは奇妙です。人々は StreamEx を愛用し、どこでも使用していますが、コードが「?」で汚染されてしまうからです。を使いたいのですList<Class<?>が、StreamEx は強制的に を使用させますList<? extends Class<?>>。StreamEx がこのように機能する理由を誰か説明できますか? 目的の変数型を StreamEx で何とか使用できますか?

private static List<? extends Class<?>> 
fooList_StreamEx_Compiles(List<Integer> input) {
    return StreamEx.of(input)
            .map(x -> foo())
            .toList();
}

private static List<Class<?>> 
fooList_StreamEx_Error(List<Integer> input) {
    return StreamEx.of(input)
            .map(x -> foo())
// Error: incompatible types: java.util.List<java.lang.Class<capture#1 of ?>> 
// cannot be converted to java.util.List<java.lang.Class<?>>
            .toList();
}

private static List<Class<?>> fooList(List<Integer> input) {
    return input
            .stream()
            .map(x -> foo())
            .collect(Collectors.toList());
}

private static Class<?> foo() {
    return String.class;
}

StreamEx 0.7.0 と Java 11 を使用しています

4

1 に答える 1