1

たとえば、クラスA、B、Cがあり、それらはすべてaに含まれていList<Object>ます(リストはXMLパーサーからのものであり、この部分には影響しません)。通常、必要なタイプは1つだけです。だから私は次のクラスを書きました:

public class FilterForObject{
public static List<A> extractA(Result r){
  return extractClass(r,A.class);
}
public static List<B> extractB(Result r){
  return  extractClass(r,B.class);
}
public static List<C> extractC(Result r){
  return  extractClass(r,C.class);
}

private static <T> List<T> exctracClass(final Result r,final Class<T> resultClass) {
    List<T> ret = new ArrayList<T>(40);
    for (Object o : r.getAorBorC()) {
        if( o instanceof T){
            ret.add((T)o); // For some reasons this doesn't work
        }
    }
    return ret;
}

}

次の警告が表示されました。

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

しかし、正確な問題はわかりません。コンパイル時に、考えられるすべての戻り値のタイプがわかっていましたか?

4

3 に答える 3

5

しかし、正確な問題は発生しません。実行時に、考えられるすべてのリターンタイプがわかっていましたか?

いいえ、型消去のため、実行時にの型T不明です。コンパイラーは、キャストまたはオペレーターのどちらでも有用なことは何もできません。instanceof

ただし、すでにパラメータを持っているので、次のClass<T> resultClassものを使用できます。

if (resultClass.isInstanceOf(o))) {
    ret.add(resultClass.cast(o));
}

型消去(および一般的なジェネリック)の詳細については、JavaジェネリックFAQを参照してください。

于 2013-03-07T13:50:26.857 に答える
3

ジェネリック型パラメーターの型トークンは既に渡されているので、コンパイラーで生成されたキャストの代わりにそれを使用できます(そして使用する必要があります)。

private static <T> List<T> exctracClass(final Result r,final Class<T> resultClass) {
    List<T> ret = new ArrayList<T>(40);
    for (Object o : r.getAorBorC()) {
        if(resultClass.isInstance(o)){
            ret.add(resultClass.cast(o));
        }
    }
    return ret;
}
于 2013-03-07T13:51:00.490 に答える
1

期待される結果のクラスがあるため、次のことができます。

private static <T> List<T> extractClass(final Result r, final Class<T> resultClass) {
    List<T> ret = new ArrayList<T>(40);
    for (Object o : r.getAorBorC()) {
        if (resultClass.isInstance(o)) {
            ret.add((T) o); // For some reasons this doesn't work
        }
    }
    return ret;
}

いくつかの特別な構造 (instanceof、casting...) でサポートされているクラスとインスタンスで実行できるすべての操作は、Class オブジェクトのメソッド (isInstance、cast、asSubclass...) を介して実行することもできます。

于 2013-03-07T13:55:33.260 に答える