例如,我有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检查.请使用其擦除对象,因为将在运行时擦除其他泛型类型信息
但是我没有得到确切的问题,在编译时所有可能的返回类型都是已知的?
但是我没有得到确切的问题,在运行时所有可能的返回类型都是已知的?
不,在运行时的类型T是不知道,由于擦除类型.编译器无法对强制转换或instanceof运算符执行任何有用的操作.
但是,您已经有了一个参数,Class<T> resultClass您可以使用:
if (resultClass.isInstanceOf(o))) {
ret.add(resultClass.cast(o));
}
Run Code Online (Sandbox Code Playgroud)
有关类型擦除(以及一般泛型)的更多信息,请参阅Java泛型常见问题解答.
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |