Посмотрите, есть ли у одного объекта один и тот же тип
Скажем, что у меня есть класс 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?
Ответы
Ответ 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
}