2009-11-22 27 views
107

HashMap<String, int> dường như không hoạt động nhưng HashMap<String, Integer> không hoạt động. Mọi ý tưởng tại sao?java: HashMap <String, int> không hoạt động

+0

lựa chọn các từ cho câu hỏi của bạn là khó hiểu, bạn có thể làm rõ không? Và chính xác những gì không hoạt động, bạn có thể đăng mã không? –

+7

@aforloney - rõ ràng đây là lỗi biên dịch. –

Trả lời

171

Bạn không thể sử dụng các kiểu nguyên thủy làm đối số chung trong Java. Sử dụng thay thế:

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

Với auto-boxing/unboxing có sự khác biệt nhỏ trong mã. Auto-boxing có nghĩa là bạn có thể viết:

myMap.put("foo", 3); 

thay vì:

myMap.put("foo", new Integer(3)); 

Auto-boxing có nghĩa là phiên bản đầu tiên được ngầm chuyển đổi sang thứ hai. Auto-unboxing có nghĩa là bạn có thể viết:

int i = myMap.get("foo"); 

thay vì:

int i = myMap.get("foo").intValue(); 

Cuộc gọi ngầm để intValue() có nghĩa là nếu phím không tìm thấy nó sẽ tạo ra một NullPointerException, ví dụ:

int i = myMap.get("bar"); // NullPointerException 

Lý do là type erasure. Không giống như, nói rằng, trong các kiểu chung C# không được giữ lại trong thời gian chạy. Họ chỉ là "cú pháp đường" cho đúc rõ ràng để giúp bạn tiết kiệm làm điều này:

Integer i = (Integer)myMap.get("foo"); 

Để cung cấp cho bạn một ví dụ, mã này là hoàn toàn hợp pháp:

Map<String, Integer> myMap = new HashMap<String, Integer>(); 
Map<Integer, String> map2 = (Map<Integer, String>)myMap; 
map2.put(3, "foo"); 
+3

Ví dụ cuối cùng của bạn không hoạt động: Không thể truyền từ Map tới Bản đồ T3rm1

+0

Tại sao nó không hoạt động với 'Float' và' Double'? –

+0

xem xét từng mã riêng biệt trong một dòng mới, mã trên dòng 5 trước tiên phải được đúc thành Số nguyên trước khi sử dụng phương thức intValue() vì nó được coi là đối tượng khi bạn sử dụng phương thức get(). –

-2

Bạn có thể sử dụng loại tham chiếu trong đối số chung, không phải kiểu nguyên thủy. Vì vậy, ở đây bạn nên sử dụng

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

và giá trị lưu trữ như

myMap.put("abc", 5); 
+1

Điều này không trả lời câu hỏi – smac89

+0

@ Smac89 Tôi không nghĩ rằng điều này cũng trả lời đúng câu hỏi, nhưng đó là câu trả lời.Vì vậy, để cách thích hợp để đối phó với điều này là downvoting, không gắn cờ. –

2

Bạn không thể sử dụng các kiểu dữ liệu trong HashMap. int hoặc double không hoạt động. Bạn phải sử dụng kiểu kèm theo của nó. ví dụ:

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

Bây giờ, cả hai đều là đối tượng, vì vậy việc này sẽ hoạt động.

Các vấn đề liên quan