簡體   English   中英

如何在Java中使用類型安全的方法轉換泛型列表?

[英]How to typesafe cast a generic list in java?

有沒有一種方法可以無需使用@SuppressWarnings("unchecked")

if (o instanceof Map) {
    Map<Object, Object> newMap = (Map<Object, Object>) o;
    ...
}

如果要寫入地圖,簡短的回答是“否”。 好了,您可以按照@ brso05提到的鏈接中給出的示例進行編碼,但是我認為這只是違背了目的。 基本上,編譯器會告訴您無法確保映射中的類型兼容。

如果您不必寫該地圖,則可以使用Map<?, ?> ,這意味着您只能從中獲取Object類型的項目。 例如:

Map untypedMap = new HashMap();
Map<?, ?> map = untypedMap;
Object someValue = map.get(aKey);

推理

原因是Java集合不是協變的

為了簡單起見,讓我們談談列表(但它也適用於地圖)。

以下內容在Java中無效(並且有充分的理由):

List<Integer> integers = new ArrayList<Integer>();
List<Object> objects = integers; // illegal

Java中的集合是可變的,這意味着您可以執行以下操作:

objects.add(1.4f);

這將更改原始integers列表,並為其添加一個浮點數。 浮點數是一個對象,因此它根據List<Object>

現在,由於向后兼容,如果未鍵入列表,則可以進行這種分配。 例如:

List untyped = new ArrayList();
List<Integer> integers = untyped; // warning here
integers.add(1);
List<Float> floats = untyped; // warning here
floats.add(1.4f);

因此代碼可以編譯,但是有錯誤。 考慮以下示例。

System.out.println(untyped.get(0)); // is okay
System.out.println(untyped.get(1)); // is okay

Float aFloat = floats.get(0);// compiles, but throws ClassCastException
System.out.println(aFloat);
Integer anInteger = integers.get(1);// compiles, but ClassCastException
System.out.println(anInteger);

由於上述原因,每當您將無類型集合分配給有類型集合時,編譯器都會發出警告。

暫無
暫無

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

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