2

コードには次のような部分があります。

A, B and C extend D

public ArrayList<A> getA() {
    ArrayList<A> allElements = new ArrayList<A>();
    for (D el : listOfDs) {
        if (el instanceof A) {
            allElements.add((A) el);
        }
    }
    return allElements;
}

public ArrayList<B> getB() {
    ArrayList<B> allElements = new ArrayList<B>();
    for (D el : listOfDs) {
        if (el instanceof B) {
            allElements.add((B) el);
        }
    }
    return allElements;
}

public ArrayList<C> getC() {
    ArrayList<C> allElements = new ArrayList<C>();
    for (D el : listOfDs) {
        if (el instanceof C) {
            allElements.add((C) el);
        }
    }
    return allElements;
}

これらすべてを次のような 1 つのメソッドに結合したいと思います。

public <T> ArrayList<T> get() {
    ArrayList<T> allElements = new ArrayList<T>();
    for (D el : listOfDs) {
        if (el instanceof T) {
            allElements.add((T) el);
        }
    }
    return allElements;
}

これはJavaで可能ですか?

私が得る瞬間に

型パラメーター T に対して instanceof チェックを実行できません。代わりにその消去オブジェクトを使用してください。それ以上のジェネリック型情報は実行時に消去されるためです。

型の安全性: Node から T へのチェックされていないキャスト

それから私はこれを試しました:

@SuppressWarnings("unchecked")
public <T> ArrayList<T> get(Class<T> clazz) {
    ArrayList<T> allElements = new ArrayList<T>();
    for(D o : listOfDs) {
        if (o.getClass() == clazz) {
            allElements.add((T) o);
        }
    }
    return allElements;
}

エラーは発生しませんが、どうすれば呼び出せますか? これはうまくいきませんでした:

get(A);
4

1 に答える 1

5

Iterables.filterGuava から使用できます。

使用例:

Iterable<X> xs = Iterables.filter(someIterable, X.class);

これはオープン ソース ライブラリであるため、ソースをチェックアウトして、間違っていることを見つけることができます。

于 2012-06-09T10:20:05.130 に答える