Java泛型:根据输入返回列表

Mem*_*eak 1 java generics

例如,我有A,B,C类,它们都在一个List<Object>(列表来自XML-Parser,我对这部分没有影响).通常我只需要一种类型.所以我写了以下课程:

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;
}

}
Run Code Online (Sandbox Code Playgroud)

我遇到了以下警告:

无法对类型参数T执行instanceof检查.请使用其擦除对象,因为将在运行时擦除其他泛型类型信息

但是我没有得到确切的问题,在编译时所有可能的返回类型都是已知的?

Jon*_*eet 5

但是我没有得到确切的问题,在运行时所有可能的返回类型都是已知的?

不,在运行时的类型T是不知道,由于擦除类型.编译器无法对强制转换或instanceof运算符执行任何有用的操作.

但是,您已经有了一个参数,Class<T> resultClass您可以使用:

if (resultClass.isInstanceOf(o))) {
    ret.add(resultClass.cast(o));
}
Run Code Online (Sandbox Code Playgroud)

有关类型擦除(以及一般泛型)的更多信息,请参阅Java泛型常见问题解答.