2010-04-23 15 views
20

Nadpisuję metodę equals() i muszę wiedzieć, czy obiekt jest instancją podklasy Event (Event jest nadklasą). Chcę coś takiego jak "obj subclassof Event". Jak można to zrobić?Java - czy istnieje "podklasa" podobna do instanceof?

Z góry dziękuję!

+10

Co z 'instanceof' który spowodował na to pytanie? Opublikuj kod za pomocą prób, oczekiwań i nieoczekiwanych sytuacji. – BalusC

Odpowiedz

41

instanceof poradzi sobie z tym dobrze.

+1

Tak, 'if (instancja mysubclass Event) // idą nuts..' – Paolo

+1

Dobrze, że nawet nie musisz sprawdzać' null'a –

0

Jeśli obiekt jest podklasą zdarzenia, to jest instancją. obj jest instancją każdej klasy/interfejsu, z którego pochodzi. Przynajmniej wszystkie obiekty są instancjami Obiektu.

1

W Javie nie ma bezpośredniej metody sprawdzania podklasy. instanceof Event wróci z powrotem prawdziwe dla dowolnej klasy sub obiektów

można zrobić getClass() na obiekcie, a następnie użyć getSuperclass() sposób na Class obiektu, aby sprawdzić czy jest Event nadklasą.

2

Możecie zajrzeć do someObject.getClass().isAssignableFrom(otherObject.getClass());

+0

Jest to przydatne tylko wtedy, gdy masz tylko informacje o klasie. Ale w 'equals()' masz obie ** instancji ** do twojej dostępności. – BalusC

+0

Tak, masz rację. Użyłem słowa "moc" z jakiegoś powodu. na przykład Pisanie metody wielokrotnego użytku "equalsHelper", która wykonuje wstępne testy dla ciebie. Prawidłowe informacje zostały już opublikowane, więc chciałem tylko dodać inne uwagi. – z5h

31

do następnego kodu można sprawdzić, czy obiekt jest klasa, która rozciąga się zdarzenie, ale nie jest sama instancja klasy Event AB.

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

Przez domyślny instanceof sprawdzenia czy dany przedmiot jest z określonej klasy lub podklasy (rozszerza lub narzędzia) na każdym poziomie imprezy.

+0

Zgadnij, że mieliśmy ten sam pomysł, ale dostałeś się tutaj pierwszy. –

+1

Po co dziękuję panu :-) Innym sposobem na zrobienie tego jest stworzenie abstrakcyjnego wydarzenia lub interfejsu, a nie sprawdzanie, czy obiekt jest konkretnie jego instancją, ponieważ tak nie jest. – Adrian

9

Naprawdę instanceof powinno być wystarczająco dobre, ale jeśli chcesz mieć pewność, że klasa jest naprawdę podklasa wtedy można zapewnić sprawdzić ten sposób:

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

Ponieważ Adrian był trochę przede mną Dodam też sposób, w jaki można to zrobić za pomocą metody ogólnego przeznaczenia.

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

Użyj tego przez:

if (isSubClassOnly(Event.class, object)) { 
    // Sub-class only 
} 
+0

Może również masz ... && clazz! = Null && ... tylko dla kompletności? : D – Paggas

+1

@Paggas: Uważam, że błąd programowania, a więc chcą mieć wyjątek NullPointerException. Zasadniczo nie można mieć 'obiektu instanceof null' więc po prostu pozwól' isSubClassOnly (null, object) '. –

Powiązane problemy