Java - есть ли «подкласс» как instanceof? - PullRequest
22 голосов
/ 23 апреля 2010

Я переопределяю метод equals (), и мне нужно знать, является ли объект экземпляром подкласса события (событие является суперклассом).Я хочу что-то вроде "obj subclassof Event".Как это можно сделать?

Заранее спасибо!

Ответы [ 6 ]

44 голосов
/ 23 апреля 2010

instanceof справится с этим просто отлично.

32 голосов
/ 23 апреля 2010

С помощью следующего кода вы можете проверить, является ли объект классом, который расширяет Event, но не является самим экземпляром класса Event.

if(myObject instanceof Event && myObject.getClass() != Event.class) {
    // then I'm an instance of a subclass of Event, but not Event itself
}

По умолчанию instanceof проверяет, принадлежит ли объект указанному классу или подклассу (расширяет или реализует) на любом уровне события.

10 голосов
/ 23 апреля 2010

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

if (object instanceof Event && object.getClass() != Event.class) {
    // is a sub-class only
}

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

public static boolean isSubClassOnly(Class clazz, Object o) {
    return o != null && clazz.isAssignableFrom(o) && o.getClass() != clazz;
}

Используйте это:

if (isSubClassOnly(Event.class, object)) {
    // Sub-class only
}
2 голосов
/ 23 апреля 2010

Возможно, вы захотите взглянуть на someObject.getClass().isAssignableFrom(otherObject.getClass());

1 голос
/ 23 апреля 2010

В Java нет прямого метода проверки подкласса. instanceof Event вернул бы значение true для любых объектов подкласса

Вы можете сделать getClass() для объекта, а затем использовать метод getSuperclass() для Class объекта, чтобы проверить, является ли суперкласс Event.

0 голосов
/ 23 апреля 2010

Если obj является подклассом Event, то это instanceof.obj является экземпляром каждого класса / интерфейса, из которого он получен.Так что, по крайней мере, все объекты являются экземплярами Object.

...