2012-04-15 2 views
17

Предположим, что у меня есть класс A, а B, C, D - это производные от A.
Если я хочу знать, каков тип ссылки на объект, я могу объявить :Посмотрите, есть ли у двух объектов одинаковый тип

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

Это потому, что я уверен, что классы, производные от а только B, C и D.
Но что, если я хочу просто проверить, что две ссылки указывают на тот же вид объекта?
Так что-то вроде:

if(obj1 instanceof obj2) 
    <do something> 

Но конечно синтаксис wrong.How, чтобы проверить это, не одну тысячу, если-то еще?

ответ

39

Вы имеете в виду что-то вроде

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

Это должно вернуть верно только если оба obj1 и obj2 одного и того же конкретного класса.

Но это не сработает, если вы сравниваете A с B extends A. Если вы хотите, чтобы равенство возвращало true, даже если это подтип другого, вам придется написать более эффективную функцию сравнения. Я думаю, что вы можете сделать это, перейдя по дереву иерархии с помощью getSuperClass().

Я думаю, что простым решением может быть также A.getClass().isAssignableFrom(B.getClass()), предполагая, что B extends A.

+0

Там нет никаких оснований делать '.equals()', класс существует только один раз в бассейне. – kba

+5

Необходимость - это не вопрос стиля. – Jack

+0

Это делает то, что я искал. –

4

Вы могли бы сделать

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

instanceof должен указывать на класс, а не на другой объект. Для того, чтобы проверить, что два объекта, оба из того же самого типа объекта сделать что-то следующее ..

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

Это фактически неверно. Вы проверяете, что два объекта являются потомками другого типа. Вопрос состоял в том, чтобы определить, имеют ли два объекта один и тот же, но * произвольный * тип. – Adowrath

0

Так как B, C и D являются подклассами А, и вы хотите сделать что-то с этими классами, я Wouldn Не используйте оператор instanceOf. Это полезно только тогда, когда нет другого пути.

Вы можете лучше переопределить супер методы и/или переменные, поэтому вы можете использовать все объекты одинаково, жестко, они будут делать что-то другое (например, напечатать свой собственный тип).

1

Что-то вроде этого:

if(classA.getClass().getName().equals(classB.getClass().getName())) 
    <do something> 
Смежные вопросы