use*_*795 8 java generics inheritance java-8 java-stream
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;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么它适用于流,并不适用于简单的集合?
对于第一种情况,它失败,因为List<TestClass>
它不是子类型List<Object>
.1
对于第二种情况,我们有以下方法声明:
interface Stream<T> {
// ...
<R, A> R collect(Collector<? super T, A, R> collector)
}
Run Code Online (Sandbox Code Playgroud)
和:
class Collectors {
// ...
public static <T> Collector<T, ?, List<T>> toList()
}
Run Code Online (Sandbox Code Playgroud)
这允许Java从上下文中推断泛型类型参数.2在这种情况下List<Object>
推断R
和Object
为T
.
因此,您的代码等同于:
Collector<Object, ?, List<Object>> tmpCollector = Collectors.toList();
List<Object> tmpList = listB.stream().collect(tmpCollector);
setListA(tmpList);
Run Code Online (Sandbox Code Playgroud)
1.见这里.
归档时间: |
|
查看次数: |
162 次 |
最近记录: |