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