为什么 Java Collector.toList() 在其返回类型中需要通配符类型占位符?
我一直在做一些Java Streams操作,当然它不喜欢我的代码,并拒绝提供有用的错误消息。(作为参考,我对C#和Linq没有任何问题,所以我从概念上理解我试图做的所有事情。因此,我开始深入研究将显式泛型类型添加到代码中的每个方法中,以便找到问题的根源,因为过去的经验告诉我,这是一条成功的前进道路。
在环顾四周时,我遇到了一些我不明白的事情。考虑以下来自 Java 源代码的代码(稍微重新格式化):
public static <T> Collector<T, ?, List<T>> toList() {
return new Collectors.CollectorImpl<>(
(Supplier<List<T>>) ArrayList::new,
List::add,
(left, right) -> {
left.addAll(right);
return left;
},
Collectors.CH_ID
);
}
为什么方法签名在其返回类型中需要通配符?当我删除它时,我得到toList
?
Wrong number of type arguments: 2; required: 3
和
Incompatible types. Required: Collector<T, List<T>, > Found: CollectorImpl<java.lang.Object, List<T>, java.lang.Object>
当我更改为 ,我得到(在上面的代码中引用这些行/方法):?
Object
List::add – Cannot resolve method 'add' left.addAll – Cannot resolve method 'addAll(java.lang.Object)'
当我把通配符放回去并检查这两个时,它们是:
List – public abstract boolean add(T e) List – public abstract boolean addAll(Collection<? extends T> c)
进一步的摆弄并没有教会我更多的东西。
我理解,在一种情况下,Java中的通配符可以转换为C#作为带有.但是上面发生了什么,其中返回类型具有裸通配符?? extends T
where TWildCard : T
toList