2010-04-23 17 views
20

En remplaçant une méthode equals() et j'ai besoin de savoir si l'objet est une instance de la sous-classe d'un événement (Event est la superclasse). Je veux quelque chose comme "obj subclassof Event". Comment cela peut-il être fait?Java - existe-t-il une "sous-classe" comme instanceof?

Merci d'avance!

+10

Quel est le problème avec 'instanceof' qui vous a fait de poser cette question? Veuillez poster du code avec vos tentatives, vos attentes et vos imprévus. – BalusC

Répondre

41

instanceof peut gérer cela très bien.

+1

Oui, 'if (mysubclass instanceof Event) // go nuts..' – Paolo

+1

Bonne chose que vous n'avez même pas besoin de vérifier pour' null' –

0

Si obj est une sous-classe de Event, il s'agit d'un instanceof. obj est une instance de chaque classe/interface dont il dérive. Donc, à tout le moins, tous les objets sont des instances d'Object.

1

Il n'y a pas de méthode directe en Java pour vérifier la sous-classe. instanceof Event serait retourner vrai pour tous les objets sous-classe

Le vous pourriez faire getClass() sur l'objet puis utiliser la méthode getSuperclass() sur l'objet Class pour vérifier si superclasse est Event.

2

Vous voudrez peut-être regarder someObject.getClass().isAssignableFrom(otherObject.getClass());

+0

Ce n'est utile que si vous avez seulement des informations de classe. Mais dans 'equals()' vous avez les deux ** instances ** à votre disponibilité. – BalusC

+0

Oui, vous avez raison. J'ai utilisé le mot «pourrait» pour une raison. par exemple. Rédaction d'une méthode "equalsHelper" réutilisable qui effectue des vérifications préliminaires pour vous. Les informations correctes avaient déjà été postées, donc je voulais juste ajouter une autre considération. – z5h

31

Avec le code suivant, vous pouvez vérifier si un objet est une classe qui étend l'événement, mais n'est pas ab instance de classe de l'événement lui-même.

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

Par chèque défaut instanceof si un objet est de la classe spécifiée ou une sous-classe (étend ou instruments) à tous les niveaux de l'événement.

+0

Devinez nous avons eu la même idée mais vous êtes arrivé en premier. –

+1

Pourquoi merci monsieur :-) L'autre façon de le faire est de faire un résumé d'événement, ou une interface, et ne pas déranger vérifier que votre objet est spécifiquement une instance de celui-ci, car il ne peut pas être. – Adrian

9

vraiment instanceof devrait être assez bon, mais si vous voulez être sûr que la classe est vraiment une sous-classe alors vous pourriez fournir la vérification de cette façon:

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

Depuis Adrian était un peu devant moi , Je vais également ajouter une façon de le faire avec une méthode générale.

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

Utilisez ce par:

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

Peut-être aussi avoir ... && clazz! = Null && ... juste pour l'exhaustivité? : D – Paggas

+1

@Paggas: Je considérerais qu'une erreur de programmation et que vous voulez avoir le NullPointerException. Fondamentalement, il n'est pas possible d'avoir 'object instanceof null', alors pourquoi autoriser' isSubClassOnly (null, object) '. –