2011-07-21 49 views
6

Map<?, ?> có nghĩa là gì trong Java?
Tôi đã xem trực tuyến nhưng dường như không tìm thấy bất kỳ bài viết nào trên đó.Bản đồ <?, ?> có nghĩa là gì trong Java?

chỉnh sửa: Tôi thấy điều này trên MP3 Duration Java

+3

'Bản đồ' như trong _collection_? hoặc phần '', như trong _generics_? Bạn đã xem javadoc chưa? – c00kiemon5ter

+0

Được rồi, tôi chắc chắn đang nói về generics và wildcards. Phần '<' bị ẩn trong câu hỏi; được hiểu là html. Tôi đã chỉnh sửa câu hỏi. – c00kiemon5ter

+0

@ C00k - bạn có thể muốn chỉnh sửa lại câu hỏi, '' không hiển thị. – Paul

Trả lời

3

? biểu thị một placeholder trong mà giá trị của bạn không quan tâm đến (một ký tự đại diện):

HashMap<?, ?> foo = new HashMap<Integer, String>(); 

Và kể từ ? là một ký tự đại diện, bạn có thể bỏ qua nó và vẫn nhận được kết quả tương tự:

HashMap foo = new HashMap<Integer, String>(); 

Nhưng chúng có thể được sử dụng để chỉ định hoặc tập hợp các generics được sử dụng. Trong ví dụ này, generic đầu tiên phải thực hiện giao diện Serializable.

// would fail because HttpServletRequest does not implement Serializable 
HashMap<? extends Serializable, ?> foo = new HashMap<HttpServletRequest, String>(); 

Nhưng tốt hơn nên sử dụng các lớp cụ thể thay vì các ký tự đại diện này. Bạn chỉ nên sử dụng ? nếu bạn biết mình đang làm gì :)

+3

Loại thô KHÔNG phải là kết quả tương tự như một ký tự đại diện! không có gì! – Affe

+0

Oh thực sự? Tôi không biết điều đó. Hai trường hợp đầu tiên này khác nhau như thế nào? – mana

+3

Thẻ hoang dã có nghĩa là 'Đây là một Bản đồ có một số loại hạn chế cụ thể trong đó, nhưng tôi không biết nó là gì.' Loại thô chỉ là loại thô, không có gì được biết về nó, không có ràng buộc, có thể có bất cứ điều gì trong đó. Trình biên dịch sẽ không cho phép bạn thêm nội dung vào Bản đồ , nhưng bạn có thể đặt bất kỳ thứ gì bạn muốn vào Bản đồ thô. – Affe

10

Map<?,?> có nghĩa là tại thời gian biên dịch, bạn không biết những gì kiểu lớp của đối tượng quan trọng và giá trị của bản đồ sẽ là.

Loại ký tự đại diện của nó. http://download.oracle.com/javase/tutorial/extra/generics/wildcards.html

+0

Xin lỗi, tôi không giỏi về generics nhưng khác biệt giữa 'Bản đồ ' và 'Bản đồ là gì? –

+1

'ClassName ' là những gì bạn sẽ viết để "xác định" một lớp hoặc giao diện. 'ClassName ' là những gì bạn muốn viết để "sử dụng" lớp chung trong chương trình của bạn với một loại không rõ (bất kỳ) nào. – Kainsin

1

Kể từ Java5, Generics được cung cấp với ngôn ngữ. http://download.oracle.com/javase/tutorial/java/generics/index.html

Ký hiệu có nghĩa là Bản đồ bạn đang tạo sẽ chấp nhận đối tượng của lớp A là khóa và đối tượng của lớp B làm giá trị.

Điều này giúp bạn với tư cách là nhà phát triển, do đó bạn sẽ không bỏ thêm Object nữa vào lớp học chính xác. Vì vậy, bạn wont có thể sử dụng bản đồ với các phím khác ngoài A và objets khác hơn B. Tránh phôi xấu xí và cung cấp thời gian biên dịch hạn chế

1

Map<?,?> nói với bạn rằng bạn có thể sử dụng tất cả các đối tượng cho keyvalue trong bản đồ của bạn.

Nhưng thường nó rất hữu ích hơn để sử dụng Generics như thế:

Map<String, YourCustomObject> map 

Vì vậy, trong bản đồ này, bạn chỉ put một String như chìa khóa và YourCustomObject như giá trị có thể.

Xem hình này tutorial trên generics.

0

? là ký tự đại diện trong Generics. Sun ... er ... Oracle có hướng dẫn tốt về generics here. Có một phần riêng biệt trên các ký tự đại diện.

Bạn có thể nhận được câu trả lời hay hơn nếu bạn đăng thêm ngữ cảnh cho câu hỏi của mình, chẳng hạn như nơi bạn đã xem Map<?, ?>.