5

私は次の方法を持っています

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

同じタイプの List を作成し、outcome最終的に返す arg として呼び出します。たとえば、

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

foo にArrayList<Integer>も an を返してほしい。もしも

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

次に、foo が a を返すようにします。LinkedList<Integer>

List は抽象的であるため、うまくいかないことはわかっList<T> outcome = new List<T>();ています。

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 ここで実装するクラスの完全なリストを見つけることができます。


EDIT(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 に答える