[英]java method returning an instance of Class<T extends Somethng>
[英]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.