Trong bộ sưu tập Java, tôi thấy một cái gì đó như thế này: Map<Key,?>
. Tôi không biết nó hoạt động như thế nào, bất cứ ai có thể giúp tôi với điều này hay cung cấp một ví dụ?Trong Bộ sưu tập Java Bản đồ <Key,?> "?" tham khảo?
Trả lời
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ặcList.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ạiNumber
, cũng như các kiểu con của nó, chẳng hạn nhưInteger
hoặcDouble
.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ạiInteger
, cũng như siêu kiểu của nó,Number
vàObject
.
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.
- 1. Bộ sưu tập <? extends T> vs Bộ sưu tập <T>
- 2. bộ sưu tập java so với bản đồ trong khung bộ sưu tập
- 3. Java Collection <Object> hoặc Bộ sưu tập <?>
- 4. Tham khảo mục tiếp theo trong bộ sưu tập Laravel
- 5. tìm đối tượng tham khảo yếu trong bộ sưu tập trong java
- 6. Danh sách Chuyển đổi <Map.Entry <Key, Value>> để Liệt kê <Key> trong Java
- 7. Cách sắp xếp Bộ sưu tập <T>?
- 8. Biểu mẫu Symfony 2, nhúng bộ sưu tập vào bộ sưu tập nhúng
- 9. Java <-> Chuyển đổi bộ sưu tập Scala, Scala 2.10
- 10. Không thể nhập khi đối số chấp nhận Bộ sưu tập <X<?>>
- 11. Sự khác biệt giữa nhóm và lập bản đồ trong Bộ sưu tập (Java) là gì?
- 12. Bản đồ <?, ?> có nghĩa là gì trong Java?
- 13. Khi nào tôi nên chấp nhận tham số Iterable <T> so với Bộ sưu tập <T> trong Java?
- 14. Java: sao chép Bộ sưu tập tùy ý thông qua tham chiếu đến Bộ sưu tập
- 15. Java -> Scala, biểu diễn trên bộ sưu tập
- 16. Bản đồ AutoMapper từ bộ sưu tập lồng nhau nguồn đến bộ sưu tập khác
- 17. C#/.NET tương đương với Bộ sưu tập Java. <T> emptyList()?
- 18. Bộ sưu tập Java không có Bản đồ như một phần của khung tuyển tập
- 19. Đảo ngược bản đồ ở định dạng <value, key> trong Golang
- 20. Dòng Java 8 vs Bộ sưu tập Bộ sưu tập
- 21. Loại kết nối Java, biến, mảng và bộ sưu tập
- 22. Bộ sưu tập bản đồ của các đối tượng
- 23. Bộ sưu tập rác java
- 24. Phiên bản bộ sưu tập của SingleOrDefault cho một từ điển <T> là gì?
- 25. Bản đồ (bộ sưu tập) duy trì Thứ tự chèn trong java
- 26. Java: Khai báo một Bản đồ với hai loại generics liên quan Các loại (<T> Bản đồ <Lớp <? Mở rộng ClassA <T>>, Lớp <? Mở rộng ClassB <T> >>)
- 27. Bộ sưu tập bản đồ JPA của Enums
- 28. Scala: cách hợp nhất một bộ sưu tập Bản đồ
- 29. Phương thức bản đồ Groovy của bộ sưu tập
- 30. Tham gia API Bộ sưu tập Java 8