首页 > 解决方案 > 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)

有任何想法吗?

标签: javagenerics

解决方案


为了避免原始类型(等)的问题,您可以传入类似“原型”对象的内容:

<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);

推荐阅读