2012-09-16 23 views
8

Nếu cần sử dụng Class<T> như một phần của khóa của Map cách thích hợp để xác định hashCodeequals là gì?
Một Class<T> thừa hưởng những từ Object mà kiểm tra cho bình đẳng tham khảo và trả về địa chỉ bộ nhớ như hashcode nhưng trong tâm trí của tôi nó không phải là rõ ràng là những gì định nghĩa ý nghĩa của equalshashCode nghĩa của một Class<T>.
Tôi có nên sử dụng theClass.getClass().hashCode(); ví dụ (nơi chúng tôi có Class<T> theClass;) để sử dụng các phương pháp của cá thể thực tế không?
Nhưng điều này dường như không chính xác.
Ví dụ trong javadoc cho Class<T>:Làm thế nào để xác định một cách có ý nghĩa hashCode và bằng cho một java.lang.Class <T>?

Mỗi mảng cũng thuộc về một lớp học mà được phản ánh như một Class đối tượng được chia sẻ bởi tất cả các mảng với các loại nguyên tố cùng và số kích thước

Vì vậy, có vẻ như trong một số trường hợp cùng một số Class<T> được chia sẻ giữa các đối tượng? Vì vậy, những gì sẽ là cách để làm theo? Có lẽ sử dụng theClass.hashCode()theClass.equals() để sử dụng bình đẳng tham chiếu? Không chắc chắn ở đây.

+0

Không có gì để xác định, vì hashcode và equals đã được triển khai, và tôi có một thời gian khó tưởng tượng như thế nào và một thời gian khó khăn hơn tưởng tượng lý do tại sao bạn sẽ thay đổi việc thực hiện đó. –

+0

@JensSchauder: Sử dụng Eclipse để tự động tạo 'hashCode' và' equals' nó đưa ra cảnh báo phàn nàn rằng 'hashCode' và' equals' không được định nghĩa cho 'Lớp'. Điều này khiến tôi lo ngại liệu đó có phải là cảnh báo hợp lệ hay không nên làm điều gì đó về nó. – Cratylus

+0

Tôi không biết bạn đang cố gắng làm gì, nhưng 'Lớp' là một lớp học là một phần của java. Bạn không thể thực hiện bất cứ điều gì cho nó. Tên đầy đủ của tệp nguồn nơi bạn cố gắng thêm hashCode và bằng? –

Trả lời

8

Việc thực hiện hashCodeequalsjava.lang.Class thừa hưởng từ java.lang.Object là có ý nghĩa và thường thích hợp, như tất cả các trường của một lớp được đảm bảo để trả lại cùng đối tượngClass từ getClass(), tức là

new Integer(2).getClass() == new Integer(3).getClass(); 

Đây là hơi chôn trong tài liệu; các javadoc of getClass() viết:

Returns:

Đối tượng Class đại diện cho lớp thời gian chạy của đối tượng này.

Xem thêm:

Literals, phần 15.8.2 của Đặc tả ngôn ngữ Java ™.

That section viết:

Một lớp học đánh giá lại theo nghĩa đen để đối tượng Class cho các loại tên (hoặc cho void) theo quy định của bộ nạp lớp xác định (§12.2) của lớp của trường hợp hiện tại .

section 12.2 viết:

bộ tải lớp Well-behaved duy trì các đặc tính này:

  • Với cùng tên, một lớp nạp tốt nên luôn luôn trả lại đối tượng cùng lớp.
  • ...

Trình tải lớp độc hại có thể vi phạm các thuộc tính này. Tuy nhiên, nó không thể làm suy yếu an ninh của hệ thống kiểu, bởi vì máy ảo Java bảo vệ chống lại điều này.

Và có, nếu định nghĩa lớp giống nhau được tải bởi trình nạp lớp khác nhau, đối tượng lớp sẽ không bằng nhau. Khi thời gian chạy trets này như là các lớp độc lập (những người chỉ xảy ra để chia sẻ cùng một tên, nhưng không cần phải tương tự, hãy để một mình nhị phân tương thích), điều này thường là mong muốn.

+0

Lưu ý phụ về điều này: Các ứng dụng như Tomcat sử dụng trình nạp lớp phân cấp và điều này có thể khiến bạn khó chịu. Tomcat cung cấp cho tất cả các ứng dụng của nó ngăn xếp lớp của riêng mình. –

0

Phương thức String getName() trả về một unique Biểu diễn chuỗi của lớp. Bạn có thể sử dụng String này cho equals/hashCode như một String thông thường nếu chương trình của bạn không sử dụng nhiều hơn một trình nạp lớp.

+0

Nhưng tôi không làm 'Bản đồ , T>' Câu hỏi của tôi là khi 'Lớp ' là ** một phần ** của khóa. Không phải chính khóa đó – Cratylus

+0

@Cratylus Câu trả lời là giống nhau; bạn sử dụng getName() trả về một biểu diễn String duy nhất của đối tượng Class; bạn sử dụng chuỗi này trong băm/bằng như thể nó là một trường thể hiện String. – m3th0dman

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