类型安全:扩展泛型时未经检查的强制转换

时间:2015-07-30 00:35:51

标签: java generics

我有以下方法

angular.module("MyApp", [])
  .run(["$rootScope", (root: {}) => {
    function registerSwitchers(...enumInfos: [string, { [value: number]: string }][]) {
      enumInfos.forEach(enumInfo => {
        var switcherName = enumInfo[0]
        var enumType = enumInfo[1]
        root[switcherName] = (value: any, cases: { [value: string]: any }) => cases[enumType[value]];
      });
    }
    registerSwitchers(
      ["switchMyEnum1", MyEnum1],
      ["switchMyEnum2", MyEnum2]);
  }])

我调用此方法来获取错误资源

private ResponseEntity<? extends ResourceSupport> createResponse(boolean isError) {
    if(isError){
        return new ResponseEntity<ErrorResource>((ErrorResource) new ErrorResource());
    }
    return new ResponseEntity<ResourceSupport>(new ResourceSupport());
}

当我这样做时,我收到此错误:

ResponseEntity<ErrorResource> e = (ResponseEntity<ErrorResource>) createResponse(logoutResult, userId);
System.out.println(e.getError());

有没有办法在不抑制错误消息的情况下强制转换对象?

2 个答案:

答案 0 :(得分:3)

您使用相同的方法返回apple和oranges实例。在运行时,由于java的类型擦除,系统无法知道是否允许该转换,因此警告。你有2种方法可以避免它:

a)创建两种不同的方法:

for (i=0,j=1; j < len; i++,j++) {

b)通过将实际的private ResponseEntity<ResourceSupport> createResponse() { return new ResponseEntity<ResourceSupport>(new ResourceSupport()); } private ResponseEntity<ErrorResource> createErrorResponse() { return new ResponseEntity<ErrorResource>(new ErrorResource()); } 实例作为参数传递来使方法完全通用:

ResourceSupport

答案 1 :(得分:0)

解决方案是:不要尝试转换为ResponseEntity<ResourceSupport>,但保留类似ResponseEntity<? extends ResourceSupport>的类型:

ResponseEntity<? extends ResourceSupport> e = createResponse(logoutResult, userId);
System.out.println(e.getError());

类型为ResponseEntity<ErrorResource>ResponseEntity<ResourceSupport>无法分配给彼此(尝试一下)。

但是您的原始代码试图这样做 - 如果没有错误,您的createResponse方法会返回new ResponseEntity<ResourceSupport>(new ResourceSupport()),但您尝试将其转换为ResponseEntity<ErrorResource>,这是不允许的。