java - 返回列表的方法带参数列表, 列表, 其中 S1 和 S2 扩展 T
问题描述
我有这个方法:
public static <T> List<T> flat(List<T>... lists){
return Stream.of(lists)
.filter(Objects::nonNull)
.flatMap(List::stream)
.collect(toList());
}
这个想法是扁平化列表列表并返回具有相同类型的列表。
假设A
和B
扩展C
。这不起作用:
List<A> listOfA;
List<B> listOfB;
List<C> listOfC = flat(listOfA, listOfB);
因为List<A>
不是一个List<C>
!
任何人都知道如何用泛型编写一个平面方法签名来承认我正在尝试做的事情?
谢谢!
解决方案
如果A
extends C
, B
extends C
, 那么List<A>
和List<B>
都可以赋值给List<? extends C>
.
所以你可以这样声明:
public static <T> List<T> flat(List<? extends T>... lists)
测试:
public static void main(String[] args) {
List<String> listOfString = List.of("sss"); // String extends from Object
List<Integer> listOfInt = List.of(1); // Integer extends from Object
List<Object> list = flat(listOfString, listOfInt);
System.out.println(list); // [sss, 1]
}
推荐阅读
- python - 当 for 循环中至少一轮为“真”时如何触发事件
- python - 如何通过 Python 连接比特币 rpc?
- mysql - 如何从另一列中的文本添加新列
- mysql - 消除具有不同的字段
- regex - 正则表达式 - 最多 30 个字符,有限制
- server - PHPList 无法连接到 smtp 服务器
- webpack - npm webpack 安装挂起
- python - 我正在尝试使用 SQLAlchemy 作为 db.session 在烧瓶应用程序中表示 sql 连接
- ansible - 字典项目的 Ansible 条件
- c# - 如何保存来自 C# 代码的用户响应并防止多选单选按钮