การประกาศhash1
เป็นการHashMap<String, ?>
กำหนดว่าตัวแปรhash1
สามารถเก็บค่าใด ๆHashMap
ที่มีคีย์String
และค่าชนิดใดก็ได้
HashMap<String, ?> map;
map = new HashMap<String, Integer>();
map = new HashMap<String, Object>();
map = new HashMap<String, String>();
ทั้งหมดข้างต้นถูกต้องเนื่องจากตัวแปร map
สามารถเก็บแมปแฮชเหล่านั้นได้ ตัวแปรนั้นไม่สนใจว่าประเภทค่าคืออะไรของแฮชแมปที่เก็บไว้
มีตัวแทนไม่ได้แต่ช่วยให้คุณใส่ชนิดของวัตถุใด ๆ ลงในแผนที่ของคุณ ตามจริงแล้วด้วยแผนที่แฮชข้างบนคุณไม่สามารถใส่อะไรลงไปโดยใช้map
ตัวแปร:
map.put("A", new Integer(0));
map.put("B", new Object());
map.put("C", "Some String");
ทั้งหมดของวิธีการโทรข้างต้นจะส่งผลให้เกิดความผิดพลาดในเวลารวบรวมเพราะ Java ไม่ทราบว่าชนิดราคาภายใน HashMap map
คือ
คุณยังสามารถรับค่าจากแผนที่แฮช แม้ว่าคุณ "ไม่ทราบประเภทของค่า" (เนื่องจากคุณไม่ทราบว่ามีแฮชแผนที่ประเภทใดอยู่ในตัวแปรของคุณ) คุณสามารถพูดได้ว่าทุกอย่างเป็นประเภทย่อยของObject
และดังนั้นไม่ว่าคุณจะออกจากแผนที่ จะเป็นประเภทวัตถุ:
HashMap<String, Integer> myMap = new HashMap<>();// This variable is used to put things into the map.
myMap.put("ABC", 10);
HashMap<String, ?> map = myMap;
Object output = map.get("ABC");// Valid code; Object is the superclass of everything, (including whatever is stored our hash map).
System.out.println(output);
บล็อกด้านบนของรหัสจะพิมพ์ 10 ถึงคอนโซล
ดังนั้นหากต้องการปิดให้ใช้ a HashMap
พร้อมด้วย wildcard เมื่อคุณไม่สนใจ (เช่นไม่สำคัญ) ประเภทของHashMap
ตัวอย่างเช่น:
public static void printHashMapSize(Map<?, ?> anyMap) {
// This code doesn't care what type of HashMap is inside anyMap.
System.out.println(anyMap.size());
}
มิฉะนั้นให้ระบุประเภทที่คุณต้องการ:
public void printAThroughZ(Map<Character, ?> anyCharacterMap) {
for (int i = 'A'; i <= 'Z'; i++)
System.out.println(anyCharacterMap.get((char) i));
}
ในวิธีการข้างต้นเราจำเป็นต้องรู้ว่ากุญแจของแผนที่นั้นCharacter
มิฉะนั้นเราจะไม่รู้ว่าจะใช้ประเภทใดเพื่อรับค่าจากมัน วัตถุทั้งหมดมีtoString()
วิธีการดังนั้นแผนที่สามารถมีวัตถุประเภทใดก็ได้สำหรับค่าของมัน เรายังคงสามารถพิมพ์ค่าต่างๆ