返回给定参数类型的列表 - java

时间:2012-11-21 00:03:52

标签: java generics

我有以下方法

static <T> List<T> foo(List<T> arg) {

我想创建一个相同类型的List,称之为outcome,作为我最终会返回的arg。例如,如果

ArrayList<Integer> arg = new ArrayList<Integer>();

我希望foo也返回ArrayList<Integer>。 如果

LinkedList<Integer> arg = new LinkedList<Integer>();

然后我希望foo返回LinkedList<Integer>

我知道List<T> outcome = new List<T>();不会起作用,因为List是抽象的,所以我想写什么来做我想做的事?

3 个答案:

答案 0 :(得分:4)

您可以使用反射

List<T> list = (List<T>)arg.getClass().newInstance(); // throws

您可以进一步约束您的方法签名

static<L extends List<?>> L foo(L arg) { ... }


LinkedList<Integer> x = foo( new ArrayList<Integer>() ); // doesn't compile

答案 1 :(得分:3)

如果您有某种返回类型,可以返回该返回类型的任何子类,因此您可以返回ArrayList<T>


编辑(1) :如果您想返回与参数类型相同的List,可以使用instanceof

static <T> List<T> foo(List<T> arg) {
    List<T> outcome = null;

    if (arg instanceof ArrayList)
        outcome = new ArrayList<T>();

    if (arg instanceof LinkedList)
        outcome = new LinkedList<T>();

    ...

    return outcome;
}

您可以找到实施List here的完整列表。


编辑(2) :这是另一个想法:

static <T, U extends List<T>> U foo(U arg) {
    U outcome = arg;    
    ... 
    return outcome;
}

但是,您可能会将您传递的列表销毁为arg,但您应该可以传递副本。

答案 2 :(得分:-1)

您可以尝试优秀的Google番石榴图书馆。我认为Lists类有你需要的东西: http://docs.guava-libraries.googlecode.com/git-history/v13.0.1/javadoc/index.html