gpt4 book ai didi

Java 将特定类的列表添加到 java.lang.Object 的列表与 java 8 流一起工作 - 为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:26 24 4
gpt4 key购买 nike

public class Test {

static List<Object> listA = new ArrayList<>();

public static void main(final String[] args) {
final List<TestClass> listB = new ArrayList<>();
listB.add(new TestClass());

// not working
setListA(listB);

// working
setListA(listB.stream().collect(Collectors.toList()));

System.out.println();
}

private static void setListA(final List<Object> list) {
listA = list;
}

}

为什么它适用于流而不适用于简单集?

最佳答案

对于第一种情况,它失败了,因为 List<TestClass>不是 List<Object> 的子类型.1

对于第二种情况,我们有以下方法声明:

interface Stream<T> {
// ...
<R, A> R collect(Collector<? super T, A, R> collector)
}

和:

class Collectors {
// ...
public static <T> Collector<T, ?, List<T>> toList()
}

这允许 Java 从上下文中推断泛型类型参数。2 在这种情况下 List<Object>推断为 R , 和 Object对于 T .

因此你的代码等同于:

Collector<Object, ?, List<Object>> tmpCollector = Collectors.toList();
List<Object> tmpList = listB.stream().collect(tmpCollector);
setListA(tmpList);

<子>1。参见例如here .

<子>2。参见例如herehere .

关于Java 将特定类的列表添加到 java.lang.Object 的列表与 java 8 流一起工作 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44547122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com