发现 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() 工作。在我的真实示例中,我有一个覆盖shutdownNow 的类,它返回一个Runnable 列表,所以我的类调用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)。