2015-03-19 11 views

Trả lời

16

Dấu chấm hỏi (?) Thể hiện một loại không xác định.

Trong ví dụ của bạn, Map<Key, ?>, điều đó có nghĩa là nó sẽ khớp với bản đồ chứa các giá trị thuộc bất kỳ loại nào. Nó không có nghĩa là bạn có thể tạo một Map<Key, ?> và chèn các giá trị của bất kỳ loại nào trong đó.

Trích dẫn từ documentation: (?)

Trong mã chung, dấu hỏi, được gọi là ký tự đại diện, đại diện cho một loại chưa biết. Ký tự đại diện có thể được sử dụng trong nhiều tình huống khác nhau: dưới dạng kiểu tham số, trường hoặc biến cục bộ; đôi khi là một kiểu trả về (mặc dù nó là thực hành lập trình tốt hơn để cụ thể hơn). Ký tự đại diện không bao giờ được sử dụng như một đối số kiểu cho một lời gọi phương thức chung, một cá thể lớp chung tạo hoặc một siêu kiểu.

Ví dụ, nói rằng bạn muốn tạo một chức năng mà sẽ in các giá trị của bất kỳ bản đồ, không phụ thuộc vào các loại giá trị:

static void printMapValues(Map<String, ?> myMap) { 
    for (Object value : myMap.values()) { 
     System.out.print(value + " "); 
    } 
} 

Sau đó gọi hàm này đi qua một Map<String, Integer> như là đối số:

Map<String, Integer> myIntMap = new HashMap<>(); 
myIntMap.put("a", 1); 
myIntMap.put("b", 2); 
printMapValues(myIntMap); 

Và bạn sẽ nhận được:

1 2 

Các ký tự đại diện cho phép bạn gọi cùng chức năng đi qua một Map<String, String>, hoặc bất kỳ loại giá trị khác, như là đối số:

Map<String, String> myStrMap = new HashMap<>(); 
myStrMap.put("a", "one"); 
myStrMap.put("b", "two"); 
printMapValues(myStrMap); 

Kết quả:

one two 

ký tự đại diện này được gọi là vô biên, vì nó không cung cấp thông tin về loại. Có một vài trường hợp mà bạn có thể muốn sử dụng ký tự đại diện không bị ràng buộc:

  • Nếu bạn không gọi phương thức nào ngoại trừ các phương pháp được xác định trong lớp Object.
  • Khi bạn đang sử dụng các phương pháp không phụ thuộc vào thông số loại, chẳng hạn như Map.size() hoặc List.clear().

Một ký tự đại diện có thể vô biên, bị chặn trên, hoặc giảm giáp:

  • List<?> là một ví dụ về một wildcard vô biên. Nó đại diện cho một danh sách các yếu tố của loại chưa biết.

  • List<? extends Number> là ví dụ về ký tự đại diện bị chặn trên. Nó khớp với một số List thuộc loại Number, cũng như các kiểu con của nó, chẳng hạn như Integer hoặc Double.

  • List<? super Integer> là ví dụ về ký tự đại diện bị chặn thấp hơn. Nó khớp với một số List thuộc loại Integer, cũng như siêu kiểu của nó, NumberObject.

1

The Unknown Wildcard

? thể được bất kỳ datatype

List<?> nghĩa một danh sách gõ vào một loại không rõ, Đây có thể là một danh sách, một danh sách, một danh sách, vv

Bây giờ, hãy đến ví dụ Map<Key,?> của bạn có nghĩa là Value được chèn vào bản đồ này có thể thuộc bất kỳ Loại dữ liệu nào.

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