簡體   English   中英

類型安全性:擴展泛型時未經檢查的強制轉換

[英]Type safety: Unchecked cast when extending generics

我有以下方法

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());

當我這樣做時,我得到這個錯誤:

"Type safety: Unchecked cast from ResponseEntity<capture#1-of ? extends ResourceSupport> to ResponseEntity<ErrorResource>"

有沒有一種方法可以在不抑制錯誤消息的情況下投射對象?

您使用相同的方法返回apples和oranges實例。 在運行時,由於java的類型擦除,系統無法知道是否允許該強制類型轉換,因此發出警告。 您有2種避免方法:

a)創建2種不同的方法:

private ResponseEntity<ResourceSupport> createResponse() {
    return new ResponseEntity<ResourceSupport>(new ResourceSupport());
}

private ResponseEntity<ErrorResource> createErrorResponse() {
    return new ResponseEntity<ErrorResource>(new ErrorResource());
}

b)通過將實際的ResourceSupport實例作為參數傳遞,使方法完全通用:

private <T extends ResourceSupport> ResponseEntity<T> createResponse(T resource) {
    return new ResponseEntity<T>(resource);
}

解決方案是:不要嘗試強制轉換為ResponseEntity<ResourceSupport> ,而將類型保留為ResponseEntity<? extends 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>轉換為ResponseEntity<ErrorResource>不允許。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM