簡體   English   中英

Java:將對象轉換為泛型類型

[英]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.

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