コードには次のような部分があります。
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);