Java泛型,嵌套类型参数

Java泛型,嵌套类型参数,java,generics,Java,Generics,我想创建一个通用方法,它获取一个集合作为参数,对元素执行一些操作(映射),并返回一个集合。 使用以下声明,这不是问题: public <R,T> Collection<R> foo(Collection<T> c); 公共集合foo(集合c); 现在,我想强制我的方法返回相同类型参数的集合,这样就不需要将返回值强制转换为特定集合。大概是这样的: public <R, T, S extends Collection> S<R> foo

我想创建一个通用方法,它获取一个
集合
作为参数,对元素执行一些操作(映射),并返回一个
集合
。 使用以下声明,这不是问题:

public <R,T> Collection<R> foo(Collection<T> c);
公共集合foo(集合c);
现在,我想强制我的方法返回相同类型参数的集合,这样就不需要将返回值强制转换为特定集合。大概是这样的:

public <R, T, S extends Collection> S<R> foo(S<T> c);
publicsfoo(sc);
遗憾的是,这没有编译


这能做到吗?正确的方法是什么?

您可以使用Java中的重载方法,尝试在映射方法中重载数据操作。

如果要使用泛型,可以执行以下操作:

public <R, S, CR extends Collection<R>, CS extends Collection<S>> CR foo(CS c);
公共CR-foo(CS-c);

问题是将您的参数和返回绑定到一个类型。

您不能以这种方式将两个泛型绑定在一起。无论如何,即使可以,您仍然需要在foo中创建一个新集合。(您不能重用c,这将创建一个受污染的堆)

一种方法是为强制执行类型的集合提供供应商:

  public static void callFoo(){
     List<String> strings = new ArrayList<>();
     ArrayList<Integer> foo = foo(strings, ArrayList::new);
  }

  public static <R,T, S extends Collection<R>> S foo(Collection<T> ts, Supplier<S> supplier){
    S s = supplier.get();
    for(T t:ts){
        s.add(null);
    }
    return s;
  }
公共静态void callFoo(){
列表字符串=新的ArrayList();
ArrayList foo=foo(字符串,ArrayList::new);
}
公共静态S-foo(收集ts、供应商){
S=供应商。get();
for(T:ts){
s、 添加(空);
}
返回s;
}

无法参数化类型参数令牌。您可能需要:
…,S扩展集合
,然后
(sc)
。R与T的关系是什么?@Powerlord,我想应用类型为T->R的映射器。T和R之间没有关系。@orimarcovitch您打算如何创建集合的新实例?@orimarcovitch并非所有集合都提供该构造函数。常用的是array.asList()或Collections.synchronized*或Collections.unmodifiable*返回的内容。我不太了解您的解决方案,但无论如何,重载不会导致我的返回值达到我想要的值…我想强制集合为同一类型,所以Java将推断返回值,我不需要每次调用method@orimarcovitch你真的试过代码吗?不需要强制转换。尽管我仍然不明白Java是如何推断返回类型的。一定是某种类型的擦除魔法。。。