Подтвердить что ты не робот

Посмотрите, есть ли у одного объекта один и тот же тип

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

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

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

if(obj1 instanceof obj2)
   <do something>

Но, конечно, синтаксис неверен. Как проверить это без одной тысячи if-else?

4b9b3361

Ответ 1

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

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

Это должно возвращать true, только если оба obj1 и obj2 имеют один и тот же конкретный класс.

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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