5

我有以下方法

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

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

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 是抽象的,所以我知道这行不通,所以我想写什么来做我想做的事?

4

3 回答 3

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
于 2012-11-21T00:18:14.243 回答
3

当你有一个特定的返回类型时,你可以返回那个返回类型的任何子类,所以你可以返回一个ArrayList<T>.


编辑(1):如果您想返回List与您的参数相同类型的 a ,您可以使用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 您可以在此处找到实现的类的完整列表。


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

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

但是,您可能会破坏作为 传递的列表arg,但您应该能够传递副本。

于 2012-11-21T00:05:52.630 回答
-1

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

于 2012-11-21T00:14:29.373 回答