List 通用参数返回列表<;儿童界面>;在流中,但直接方法调用返回列表<;家长>;

List 通用参数返回列表<;儿童界面>;在流中,但直接方法调用返回列表<;家长>;,list,generics,lambda,java-8,generic-list,List,Generics,Lambda,Java 8,Generic List,对于设置,我有: interface Parent interface Child1 extends Parent interface Child2 extends Parent 在其他地方,我有: public class MyClass { private List<Child1> child1List = new ArrayList<>(); public List<Parent> getChild1List(Contact co

对于设置,我有:

interface Parent

interface Child1 extends Parent

interface Child2 extends Parent
在其他地方,我有:

public class MyClass {
    private List<Child1> child1List = new ArrayList<>();

    public List<Parent> getChild1List(Contact contact) {
        return child1List.parallelStream()
                         .filter(m -> m.getContacts().contains(contact))
                         .sorted(Comparator.comparing(Parent::getParentField))
                         .collect(Collectors.toList());
    }
}
但现在它不喜欢这样,因为getChild1List返回了一个
列表
。我不明白为什么,因为流的实现根本没有改变——除了启动它的childList通过一个通用参数,而不是直接调用MyClass的私有成员字段

那么,为什么它们返回两个不同的东西呢?

(这个例子令人困惑。
会议是否真的是
父级会议?)

getChild1List
的第一个版本中,对
流调用
collect(toList())
方法,其目标类型(由
getChild1List
的返回类型确定)为
List
。这是可行的,因为它允许T类型的流由T超类型的收集器收集。更具体地说,您正在将类型
Child1
的实例添加到类型安全且允许的
列表中。您也可以将
getChild1List()
的声明更改为返回
List
,而不是
List

通过查看
流中
collect()
的声明,您可以看到允许差异的位置:

不允许差异。它接受类型为
List
的参数,并返回
List
。参数和返回类型必须相同。这就是为什么当您传入
列表
并尝试从返回类型为
列表
的方法返回它时会出现不匹配的原因——这些类型是不兼容的

要解决此问题,您需要在
returnsListByContact
的声明中添加一些差异。我是这样做的:

<T extends Parent> List<T> returnsListByContact(List<? extends T> childList, ...)
List返回stbycontact(List(该示例令人困惑。
Meeting
真的是
Parent
?)

在第一个版本的
getChild1List
中,
collect(toList())
方法是在
流上调用的
,其目标类型(由
getChild1List
的返回类型确定)是
List
。这是有效的,因为它允许T类型的流由T超类型的收集器收集。更具体地说,您将类型
Child1
的实例添加到
List
是类型安全的,并且是允许的。您也可以将
getChild1List()
的声明更改为返回
List
,而不是
List

通过查看
流中
collect()
的声明,您可以看到允许差异的位置:

不允许差异。它接受类型为
List
的参数并返回
List
。参数和返回类型必须相同。这就是为什么传入
列表
并尝试从返回类型为
List
的方法返回时出现不匹配的原因——这些类型不兼容

要解决此问题,您需要在您的
returnsListByContact
声明中添加一些差异

<T extends Parent> List<T> returnsListByContact(List<? extends T> childList, ...)

列表返回列表按联系人(ListI修复了格式设置。对内联代码使用反引号,并用四个空格缩进以格式化代码块。如果希望代码显示四个空格的缩进,则必须添加四个空格以格式化为代码块,然后再添加四个空格以使缩进可见。不要使用制表符。谢谢!我无法理解如何在写多行时使块保持稳定。我修复了格式。对内联代码使用反引号,并用四个空格缩进以格式化代码块。如果希望代码显示四个空格的缩进,则必须添加四个空格以格式化为代码块,然后再为ind添加四个空格要使entation可见。不要使用制表符。谢谢!我不知道如何在写多行时使块保持稳定。加上第一句话中的一个,我也无法理解它。是的,Meeting是实际名称-它的任何实例都是父对象。编辑我的原始代码以更清楚。我以为我已经清除了它的代码,以具有讽刺意味的是,要让一般人都能读懂这篇文章……这个项目花了太多的时间……我有时间来处理这篇文章,而且你的修复程序运行得非常好。我原以为
.collect()
的返回类型基于您输入到
流中的内容,并且不知道该方法的返回类型对结果有任何影响。非常感谢!加上第一句话中的一个,我也无法理解它。是的,Meeting是实际名称-它的任何实例都是Parent。将我的原始代码编辑为更清楚。我想我已经清除了我的代码,讽刺的是,为了让它对普通人可读…这个项目花费了太多的时间…有时间来处理这个问题,你的修复程序运行得非常好。我想
.collect()
的返回类型基于您输入到
流的内容,并且不知道该方法的返回类型对结果有任何影响。非常感谢!
<R,A> R collect(Collector<? super T,A,R> collector)
<T extends Parent> List<T> returnsListByContact(List<T> childList, ...)
<T extends Parent> List<T> returnsListByContact(List<? extends T> childList, ...)