我有两个班级如下:
// Jackson annotated-class
public class User {
}
和
// Jackson annotated-class
public class ResponseWrapper<ResultType> {
...
}
在某项操作中,我需要进行演员表。
案例1:
ResponseWrapper<User> r = (ResponseWrapper<User>) result.getResult();
警告: Type safety: Unchecked cast from Object to ResponseWrapper<User>
案例2 :
Object o = result.getResult();
if ( o instanceof ReaponseWrapper<?> ) {
ResponseWrapper<?> r = (ResponseWrapper<?>) result.getResult(); // OK
}
无警告。
案例3
Object o = result.getResult();
if ( o instanceof ResponseWrapper ) {
ResponseWrapper<User> r = (ResponseWrapper<User>) result.getResult();
}
警告(再次):Type safety: Unchecked cast from Object to ResponseWrapper<User>
如何执行从Object
到ResponseWrapper<User>
的类型安全演员?
答案 0 :(得分:3)
你做不到。泛型是一个编译时的帮助。在运行时,Java使用类型擦除。因此,如果您的包装器是ResponseWrapper<Foo>
或ResponseWrapper<Bar>
,则Java无法在运行时检查。所有可以检查的是它是ResponseWrapper
。这就是你得到这样警告的原因。
答案 1 :(得分:1)
使用泛型声明getResult
,如下所示:
public <T extends ResponseWrapper> T getResult() {
...
}
如果getResult
方法来自您无法更改的库,则无法修复警告。