簡體   English   中英

Java:方法返回 Class<t> (在哪里<t extends basetype> )。 返回子類 class 導致類型不匹配錯誤</t></t>

[英]Java: Method returns Class<T> (where <T extends BaseType>). Returning subclass class causes type mismatch error

長期讀者,第一次來電(無論如何都在這個板上)。

設想以下內容:

 public class BaseClass{ }

 public class C1 extends BaseClass { }

 public class C2 extends BaseClass { }

現在,我有一個方法:

private static <T extends BaseClass> Class<T> getBaseClassType(boolean b) {
    if (b) {
        return C1.class;
    } else {
        return C2.class;
    }
}

我認為這是有效的,因為C1.class C2.class滿足類型聲明<T extends BaseClass> 但是,'return' 語句被標記為“類型不匹配:無法從Class<C1>轉換為Class<T> ”。

這是為什么? 可以以不需要強制轉換的方式重新表達上述方法嗎?

我可以像這樣轉換返回的值:

private static <T extends BaseClass> Class<T> getBaseClassType(boolean b) {
    if (b) {
        return (Class<T>) C1.class;
    } else {
        return (Class<T>) C2.class;
    }
}

...但這會產生警告“類型安全:從 Class 到 Class 的未經檢查的強制轉換”(當然,可以抑制)。 我很困惑為什么這是必要的,因為C1 (或C2 )擴展了BaseClass

使編輯器/編譯器滿意的“正確”方法是什么?

謝謝!

原來解決方案是刪除顯式類型並替換未知類型規范:

private static Class<? extends BaseClass> getBaseClassType(boolean b) {
    if (b) {
        return (Class<T>) C1.class;
    } else {
        return (Class<T>) C2.class;
    }
}

在搜索了一些“相關”答案后,我發現了這一點。

您必須調整 class 返回類型,如下所示。

private static Class<? extends BaseClass> getBaseClassType(boolean b) {
    if (b) {
        return  C1.class;
    } else {
        return C2.class;
    }
}

問題是強制轉換是運行時檢查和編譯時間,它不知道 T 的類型是什么,為什么它會發出警告以在強制轉換之前檢查 class 的類型以獲得更安全的一面。

使用 @SuppressWarnings("unchecked") 禁止警告 -

@SuppressWarnings("unchecked") 方法簽名

或將未知類型添加為

私有 static 類<? 擴展 BaseClass> getBaseClassType(boolean b)

暫無
暫無

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

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