[英]Java: Casting Object to a generic type
在Java中從Object轉換為其他類型時,為什么第二行會產生與轉換相關的警告,但第一行不會?
void a(Object o) {
Integer i = (Integer) o;
List<Integer> list = (List<Integer>) o;
}
/*Type safety: Unchecked cast from Object to List<Integer>*/
這是因為由於類型擦除,在執行時不會真正檢查對象是否為List<Integer>
。 它真的只是將它投射到List
。 例如:
List<String> strings = new ArrayList<String>();
strings.add("x");
Object o = strings;
// Warning, but will succeeed at execution time
List<Integer> integers = (List<Integer>) o;
Integer i = integers.get(0); // Bang!
有關詳細信息,請參閱Angelika Langer的Java Generics FAQ ,尤其是類型擦除部分 。
為清楚起見,讓我稍微重寫一下這些例子......
我會說, 兩者之間的關鍵區別 :
void a(Object o) {
Integer i = (Integer) o;
...
}
和
void a(Object o) {
List<Integer> list = (List<Integer>) o;
...
}
是的,鑒於存在類型錯誤 ,第一個強制轉換將始終在執行時立即拋出 RuntimeException(特別是ClassCastException)。
雖然第二個可能沒有 - 只要輸入參數o是任何類型的List<?>
,執行就會繼續, 盡管有不正確的強制轉換。
代碼是否會稍后拋出異常,取決於您對列表的處理方式。
但無論如何,可能不會在構建轉換的行上拋出異常 ,而是在其他地方拋出 (可能是難以追蹤的錯誤)或根本不拋出異常 。
這就是我所理解的,是編譯器設計者在第二種情況下認為適當的警告的原因。
Jon的答案是正確的,但偶爾你無法解決這個警告(比如當你使用遺留API時)。 在這些情況下,您可以像這樣抑制警告:
@SuppressWarnings("unchecked")
List<Integer> list = (List<Integer>) someApiThatReturnsNonGenericList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.