Java类型安全铸造问题

时间:2014-10-24 11:30:39

标签: java casting

我有两个班级如下:

// 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>

如何执行从ObjectResponseWrapper<User>的类型安全演员?

2 个答案:

答案 0 :(得分:3)

你做不到。泛型是一个编译时的帮助。在运行时,Java使用类型擦除。因此,如果您的包装器是ResponseWrapper<Foo>ResponseWrapper<Bar>,则Java无法在运行时检查。所有可以检查的是它是ResponseWrapper。这就是你得到这样警告的原因。

答案 1 :(得分:1)

使用泛型声明getResult,如下所示:

public <T extends ResponseWrapper> T getResult() {
     ...
}

如果getResult方法来自您无法更改的库,则无法修复警告。