java: HashMap <String, int> không hoạt động


128

HashMap<String, int>dường như không hoạt động nhưng HashMap<String, Integer>làm việc Bất cứ ý tưởng tại sao?


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

Câu trả lời:


203

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ó rất ít sự khác biệt trong mã. Tự động đấm bốc có nghĩa là bạn có thể viết:

myMap.put("foo", 3);

thay vì:

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

Tự động đấm bốc có nghĩa là phiên bản đầu tiên được chuyển đổi hoàn toàn sang phiên bản thứ hai. Tự động hủy hộp 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 không tìm thấy khóa, nó sẽ tạo ra một NullPointerExceptionví dụ:

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

Lý do là loại tẩy xóa . Không giống như, giả sử, trong các loại chung C # không được giữ lại trong thời gian chạy. Chúng chỉ là "đường cú pháp" để đúc rõ ràng để cứu bạn làm điều này:

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

Để 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ừ Bản đồ <Chuỗi, Số nguyên> sang Bản đồ <Số nguyên, Chuỗi>
T3rm1

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 chuyển thành Integer trước khi sử dụng phương thức intValue () vì nó được coi là một đối tượng khi bạn sử dụng phương thức get ().
học viên mới vào


2

Bạn không thể sử dụng các loại nguyên thủy trong HashMap. inthoặc doublekhông làm việc Bạn phải sử dụng loại 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 điều này sẽ làm việc.


0

int là một kiểu nguyên thủy, bạn có thể đọc nghĩa của kiểu nguyên thủy trong java ở đây và Map là một giao diện có các đối tượng làm đầu vào:

public interface Map<K extends Object, V extends Object>

đối tượng có nghĩa là một lớp và cũng có nghĩa là bạn có thể tạo một lớp khác xuất phát từ nó, nhưng bạn không thể tạo một lớp xuất phát từ int. Vì vậy, bạn không thể sử dụng biến int làm đối tượng. Tôi có giải pháp kéo cho vấn đề của bạn:

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

hoặc là

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

Bạn có thể sử dụng kiểu tham chiếu trong các đố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à lưu trữ giá trị như

myMap.put("abc", 5);

1
Điều này không trả lời câu hỏi
smac89
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.