Khai báo hash1
như là một HashMap<String, ?>
mệnh lệnh rằng biến hash1
có thể chứa bất kỳ HashMap
cái nào có khóa String
và bất kỳ loại giá trị nào.
HashMap<String, ?> map;
map = new HashMap<String, Integer>();
map = new HashMap<String, Object>();
map = new HashMap<String, String>();
Tất cả những điều trên là hợp lệ, bởi vì biến map
có thể lưu trữ bất kỳ bản đồ băm nào. Biến đó không quan tâm loại Giá trị là gì, của hàm băm mà nó giữ.
Có một ký tự đại diện không không , tuy nhiên, cho phép bạn đặt bất kỳ loại đối tượng vào bản đồ của bạn. như một vấn đề thực tế, với bản đồ băm ở trên, bạn không thể đặt bất cứ thứ gì vào đó bằng map
biến:
map.put("A", new Integer(0));
map.put("B", new Object());
map.put("C", "Some String");
Tất cả các lệnh gọi phương thức trên sẽ dẫn đến lỗi thời gian biên dịch vì Java không biết loại Giá trị của HashMap bên trong map
là gì.
Bạn vẫn có thể nhận được một giá trị từ bản đồ băm. Mặc dù bạn "không biết loại giá trị" (vì bạn không biết loại bản đồ băm nào bên trong biến của mình), bạn có thể nói rằng mọi thứ đều là một lớp con của Object
và, vì vậy, bất cứ điều gì bạn thoát khỏi bản đồ sẽ thuộc loại 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);
Khối mã trên sẽ in 10 đến bàn điều khiển.
Vì vậy, để kết thúc, hãy sử dụng một HashMap
ký tự đại diện khi bạn không quan tâm (ví dụ: không quan trọng) các loại của HashMap
chúng là gì, ví dụ:
public static void printHashMapSize(Map<?, ?> anyMap) {
// This code doesn't care what type of HashMap is inside anyMap.
System.out.println(anyMap.size());
}
Nếu không, chỉ định các loại mà bạn cần:
public void printAThroughZ(Map<Character, ?> anyCharacterMap) {
for (int i = 'A'; i <= 'Z'; i++)
System.out.println(anyCharacterMap.get((char) i));
}
Trong phương pháp trên, chúng ta cần biết rằng khóa của Bản đồ là Character
, nếu không, chúng ta sẽ không biết nên sử dụng loại nào để nhận các giá trị từ nó. toString()
Tuy nhiên, tất cả các đối tượng đều có một phương thức, do đó bản đồ có thể có bất kỳ loại đối tượng nào cho các giá trị của nó. Chúng tôi vẫn có thể in các giá trị.