2016-10-20 207 views
3

我想创建一个泛型方法,获取Collection<T>作为参数,对元素(映射)执行某些操作并返回Collection<R>。 这不是一个问题,声明如下:Java泛型,嵌套类型参数

public <R,T> Collection<R> foo(Collection<T> c); 

现在,我想迫使我的方法返回相同类型的参数的集合,所以就没有必要把返回对特定收藏的价值。类似这样的:

public <R, T, S extends Collection> S<R> foo(S<T> c); 

可悲的是,这不能编译。

这可以以某种方式完成吗?什么是正确的方法来做到这一点?

+0

你不能参数化类型参数标记。你可能想要:'...,S扩展集合'然后'(S c)'。 –

+0

R与T有什么关系? – Powerlord

+0

@Powerlord,我想申请一个类型T-> R的映射器。 T和R之间没有关系。 –

回答

1

一种方法是做到以下几点:

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

的问题是结合你的说法,你的返回类型。

+0

我想强制集合是相同类型的,所以Java会推断返回值,我不需要每次调用方法 –

+0

@orimarcovitch您是否真的尝试过代码?不需要铸造。 –

+0

你其实是对的!这确实有用! –

-1

您可以使用Java中的方法重载,尝试在您的映射方法中重载数据操作。如果你想使用泛型要做到这一点

+0

我真的不明白你的解决方案,但无论如何,重载不会导致我的返回值是我想要的... –

0

你不能以这种方式将两种仿制药绑在一起。无论如何,即使你仍然需要在foo中创建一个新的集合。 (您不能重复使用C,这将创建一个poluted堆)这样做会为强制执行的类型集合提供了供应商的

方式一:

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