HashMap<String, int>
ดูเหมือนจะไม่ได้ผล แต่HashMap<String, Integer>
ใช้งานได้ ความคิดใด ๆ ทำไม?
HashMap<String, int>
ดูเหมือนจะไม่ได้ผล แต่HashMap<String, Integer>
ใช้งานได้ ความคิดใด ๆ ทำไม?
คำตอบ:
คุณไม่สามารถใช้ประเภทดั้งเดิมเป็นอาร์กิวเมนต์ทั่วไปใน Java ใช้แทน:
Map<String, Integer> myMap = new HashMap<String, Integer>();
ด้วยการชกมวยอัตโนมัติ / การแกะกล่องมีความแตกต่างเล็กน้อยในรหัส Auto-Boxing หมายความว่าคุณสามารถเขียน:
myMap.put("foo", 3);
แทน:
myMap.put("foo", new Integer(3));
การชกมวยอัตโนมัติหมายถึงเวอร์ชันแรกถูกแปลงเป็นเวอร์ชันที่สองโดยปริยาย การแกะกล่องอัตโนมัติหมายความว่าคุณสามารถเขียน:
int i = myMap.get("foo");
แทน:
int i = myMap.get("foo").intValue();
การเรียกโดยปริยายintValue()
หมายถึงหากไม่พบคีย์ก็จะสร้าง a NullPointerException
ตัวอย่างเช่น:
int i = myMap.get("bar"); // NullPointerException
เหตุผลก็คือลบออกประเภท ต่างจากที่กล่าวคือในประเภททั่วไปของ C # จะไม่ถูกเก็บไว้ที่รันไทม์ พวกเขาเป็นเพียง "น้ำตาลวากยสัมพันธ์" สำหรับการแคสต์อย่างชัดเจนเพื่อช่วยให้คุณไม่ทำสิ่งนี้:
Integer i = (Integer)myMap.get("foo");
เพื่อให้คุณเป็นตัวอย่างรหัสนี้ถูกต้องตามกฎหมาย:
Map<String, Integer> myMap = new HashMap<String, Integer>();
Map<Integer, String> map2 = (Map<Integer, String>)myMap;
map2.put(3, "foo");
GNU Trove สนับสนุนสิ่งนี้ แต่ไม่ใช้ generics http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html
คุณไม่สามารถใช้ประเภทดั้งเดิมในHashMap
. int
หรือdouble
ไม่ทำงาน คุณต้องใช้ประเภทการปิดล้อม สำหรับตัวอย่าง
Map<String,Integer> m = new HashMap<String,Integer>();
ตอนนี้ทั้งสองเป็นวัตถุดังนั้นสิ่งนี้จะได้ผล
int เป็นประเภทดั้งเดิมคุณสามารถอ่านความหมายของประเภทดั้งเดิมใน java ได้ที่นี่และแผนที่เป็นอินเทอร์เฟซที่มีให้กับวัตถุเป็นอินพุต:
public interface Map<K extends Object, V extends Object>
object หมายถึงคลาสและหมายความว่าคุณสามารถสร้างคลาสอื่นที่ออกจากคลาสได้ แต่คุณไม่สามารถสร้างคลาสที่ออกจาก int ได้ ดังนั้นคุณจึงไม่สามารถใช้ตัวแปร int เป็นวัตถุได้ ฉันมีวิธีแก้ปัญหาสำหรับคุณ:
Map<String, Integer> map = new HashMap<>();
หรือ
Map<String, int[]> map = new HashMap<>();
int x = 1;
//put x in map
int[] x_ = new int[]{x};
map.put("x", x_);
//get the value of x
int y = map.get("x")[0];
คุณสามารถใช้ประเภทการอ้างอิงในอาร์กิวเมนต์ทั่วไปไม่ใช่ประเภทดั้งเดิม ที่นี่คุณควรใช้
Map<String, Integer> myMap = new HashMap<String, Integer>();
และจัดเก็บมูลค่าเป็น
myMap.put("abc", 5);