2012-04-15 8 views
17

Giả sử tôi có lớp A và B, C, D có nguồn gốc từ A.
Nếu tôi muốn biết loại đối tượng được tham chiếu là gì, tôi có thể khai báo :Xem hai đối tượng có cùng loại

// pseudo-code 
if(obj instanceof B) 
    < is B> 
else if(obj instanceof C) 
    < is C> 
else 
    <is D> 

này bởi vì tôi chắc chắn rằng các lớp học có nguồn gốc từ A chỉ B, C và D.
Nhưng nếu tôi muốn chỉ để kiểm tra xem hai tài liệu tham khảo trỏ đến cùng một loại đối tượng?
Vì vậy, một cái gì đó như:

if(obj1 instanceof obj2) 
    <do something> 

Nhưng tất nhiên cú pháp là wrong.How để kiểm tra này mà không có một ngàn if-else?

Trả lời

39

Bạn có nghĩa là một cái gì đó giống như

obj1.getClass().equals(obj2.getClass()) 

này sẽ trả về đúng chỉ nếu cả hai obj1obj2 là của lớp cụ thể như vậy.

Nhưng điều này sẽ không hoạt động nếu bạn đang so sánh A với B extends A. Nếu bạn muốn sự bình đẳng trả về true ngay cả khi một là một kiểu con của một kiểu khác, bạn sẽ phải viết một hàm so sánh mạnh mẽ hơn. Tôi nghĩ rằng bạn có thể làm điều đó bằng cách lặp lại với getSuperClass() để đi lên cây phân cấp.

Tôi nghĩ một giải pháp đơn giản cũng có thể là A.getClass().isAssignableFrom(B.getClass()), giả sử rằng B extends A.

+0

Không có lý do gì để làm 'Equals()', lớp chỉ tồn tại một lần trong hồ bơi. – kba

+5

Sự cần thiết không phải là vấn đề về phong cách. – Jack

+0

Đó là những gì tôi đang tìm kiếm. –

4

Bạn có thể làm

if (obj1.getClass() == obj2.getClass()) { ... } 
-2

instanceof cần trỏ tới một lớp, không phải đối tượng khác. Để kiểm tra xem hai đối tượng đó có xuất phát từ cùng một loại đối tượng hay không làm điều gì đó như sau ..

if((obj1 instanceof ClassName) && (obj2 instanceof ClassName)) { 
    do whatever 
} 
+0

Điều này là không chính xác. Bạn đang kiểm tra wheter hai đối tượng là hậu duệ của một số loại khác. Câu hỏi đặt ra là để tìm xem hai vật thể có cùng loại, nhưng * tùy ý *. – Adowrath

0

Vì B, C và D là phân lớp của A và bạn muốn làm điều gì đó với các lớp này, tôi sẽ không sử dụng toán tử instanceOf. Điều này chỉ hữu ích khi không còn cách nào khác.

Bạn có thể ghi đè lên các phương pháp siêu và/hoặc các biến, vì vậy bạn có thể sử dụng tất cả các đối tượng giống nhau, khó khăn chúng sẽ làm điều gì đó khác (ví dụ: in loại riêng của nó).

1

Something như thế này:

if(classA.getClass().getName().equals(classB.getClass().getName())) 
    <do something>