0

collect(Collectors.toList()) と Stream.toList() の違いが見つかりました。見る

class Animal { }
class Cat extends Animal { }
record House(Cat cat) { }

class Stuff {
    public static void function() {
        List<House> houses = new ArrayList<>();
        List<Animal> animals1 = 
            houses.stream()
                  .map(House::cat)
                  .collect(Collectors.toList()); // ok
        List<Animal> animals2 =
            houses.stream()
                  .map(House::cat).toList(); // compile error
        List<Animal> animals3 =
            houses.stream()
                  .map(House::cat)
                  .map(cat -> (Animal) cat).toList(); // ok
    }
}

collect(Collectors.toList()) は、動物のリストまたは猫のリストを取得できます。しかし、Stream.toList() は Cat のリストしか提供できません。

問題は、Stream.toList() を機能させる方法があるかどうかです。私の実際の例では、Runnable のリストを返す shutdownNow をオーバーライドするクラスがあるため、私のクラスは something.stream().collect(Collectors.toList()) を呼び出していましたが、something.stream().toList() MyRunnable のリストを返します。

default <U super T> List<U> toList()私の一部は、彼らが関数を の代わりにとして宣言したことを望んでいdefault List<T> toList()ますが、奇妙なことに、それは私のマシンでのコンパイル エラーです (私のコンパイラは、U extends T ではなく、U super T で問題ないようです)。

4

2 に答える 2