java: HashMap <String, int> ไม่ทำงาน


128

HashMap<String, int>ดูเหมือนจะไม่ได้ผล แต่HashMap<String, Integer>ใช้งานได้ ความคิดใด ๆ ทำไม?


คำที่คุณเลือกสำหรับคำถามของคุณสับสนคุณสามารถชี้แจงได้หรือไม่? และสิ่งที่ไม่ทำงานคุณสามารถโพสต์รหัสได้หรือไม่?
Anthony Forloney

คำตอบ:


204

คุณไม่สามารถใช้ประเภทดั้งเดิมเป็นอาร์กิวเมนต์ทั่วไปใน 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");

3
ตัวอย่างสุดท้ายของคุณไม่ทำงาน: ไม่สามารถส่งจากแผนที่ <String, Integer> ไปยัง Map <Integer, String>
T3rm1

เมื่อพิจารณาโค้ดที่แยกจากกันในบรรทัดใหม่โค้ดในบรรทัด 5 จะต้องถูกแคสต์เป็นจำนวนเต็มก่อนที่จะใช้เมธอด intValue () เนื่องจากถือว่าเป็นอ็อบเจ็กต์เมื่อคุณใช้เมธอด get ()
ผู้เรียนใหม่


2

คุณไม่สามารถใช้ประเภทดั้งเดิมในHashMap. intหรือdoubleไม่ทำงาน คุณต้องใช้ประเภทการปิดล้อม สำหรับตัวอย่าง

Map<String,Integer> m = new HashMap<String,Integer>();

ตอนนี้ทั้งสองเป็นวัตถุดังนั้นสิ่งนี้จะได้ผล


0

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];

-3

คุณสามารถใช้ประเภทการอ้างอิงในอาร์กิวเมนต์ทั่วไปไม่ใช่ประเภทดั้งเดิม ที่นี่คุณควรใช้

Map<String, Integer> myMap = new HashMap<String, Integer>();

และจัดเก็บมูลค่าเป็น

myMap.put("abc", 5);

1
สิ่งนี้ไม่ตอบคำถาม
smac89
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.