java - Java泛型从参数返回类型的子集合
问题描述
T: 一个类型
C: 集合的一个子类型
R: T 和 C 组合的返回
示例:
T = StackOverflow.class
C = List.class
R =List<StackOverflow>
如何在方法签名中对此进行说明?
应该这样写?
<T, <C extends Collection>, R extends C<T>> HttpResponse<R>
process(Class<T> returnType, Class<C> parametrizedReturnType)
我知道C<T>
行不通。
为了做
List<StackOverflow> res = process(StackOverflow.class, List.class)
有任何想法吗?
解决方案
为了避免原始类型(等)的问题,您可以传入类似“原型”对象的内容:
<T, C extends Collection<T>> HttpResponse<C> process(C prototype) {
...
}
所以你可以这样调用:
HttpResponse<List<String>> response = process(new ArrayList<>());
原型对象的性质取决于您需要在process
方法中使用它做什么。也许你可以接受一个空列表;也许您需要传入实例的供应商,例如:
<T, C extends Collection<T>> HttpResponse<C> process(Supplier<C> supplier) {
return new HttpResponse<>(supplier.get());
}
HttpResponse<List<String>> response = process(ArrayList::new);
推荐阅读
- r - 按组计算连续天数
- sql - ORA-01722: 子查询上的数字无效
- memory - Protobuf 地图不断为 arena 分配新元素
- java - Spring Data REST - 在休息控制器的可分页参数中排序始终为空
- apache-spark - Apache Spark DStream 与 HDFS 序列文件中的静态数据记录连接的最佳方式是什么?
- mysql - 如何在 MYSQL 中为 varchar 自动递增
- android - Android : 如何修复有关 setting.adzcore.com 的错误
- java - 无法创建参数化类型的数组
- html - 使用 Card-img-overlay 和 card-columns 的问题
- swiftui - 在 SwiftUI 中将变量从一个视图传递到另一个视图时,EnvironmentVariables 不起作用