242 votes

Vérifier si une classe est une sous-classe d'une autre classe en Java

Je suis en train de jouer autour avec Java de l'API reflection et essayer de gérer certains domaines. Maintenant, je suis coincé avec l'identification du type de mes champs. Les chaînes sont facile, il suffit de faire myField.getType().equals(String.class). La même chose s'applique pour les autres non-classes dérivées. Mais comment puis-je vérifier les classes dérivées? E. g. LinkedList comme sous-classe de la List. Je ne trouve pas de isSubclassOf(...) ou extends(...) méthode. Ai-je besoin de marcher à travers tout getSuperClass() et de trouver mon supeclass par mon propre?

Merci!
craesh

465voto

Sean Patrick Floyd Points 109428

Vous voulez cette méthode:

boolean isList = List.class.isAssignableFrom(myClass);

À partir de la JavaDoc:

Détermine si la classe ou de l'interface représentée par cette Class objet est identique, ou est une super-classe ou superinterface de, la classe ou l'interface représentée par le spécifiée Class paramètre. Il retourne true si oui; sinon, elle retourne false. Si cette Class objet représente un type primitif, cette méthode retourne true si l' Class paramètre est exactement ce Class objet; sinon, elle retourne false.

Référence:


Connexes:

a) Vérifier si un Objet est une instance d'une Classe ou d'Interface (y compris les sous-classes) vous savez au moment de la compilation:

boolean isInstance = someObject instanceof SomeTypeOrInterface;

Exemple:

assertTrue(Arrays.asList("a", "b", "c") instanceof List<?>);

b) Vérifier si un Objet est une instance d'une Classe ou d'Interface (y compris les sous-classes) vous savez seulement au moment de l'exécution:

Class<?> typeOrInterface = // acquire class somehow
boolean isInstance = typeOrInterface.isInstance(someObject);

Exemple:

public boolean checkForType(Object candidate, Class<?> type){
    return type.isInstance(candidate);
}

29voto

Landei Points 30509

Une autre option est instanceof:

 Object o =...
if (o instanceof Number) {
  double d = ((Number)o).doubleValue(); //this cast is safe
}
 

9voto

Marco Points 106

instanceof travaux sur les instances, c'est à dire sur des Objets. Parfois, vous souhaitez travailler directement avec les classes. Dans ce cas, vous pouvez utiliser le asSubClass méthode de la Classe class. Quelques exemples:

1)

    Class o=Object.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);

cela va passer par de douceur, car JFrame est sous-classe de l'Objet. c contiendra une Classe de l'objet représentant la classe JFrame.

2)

    Class o=JButton.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);

cela va lancer une java.lang.ClassCastException parce que JFrame n'est PAS sous-classe JButton. c ne sera pas initialisé.

3)

    Class o=Serializable.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);

cela va passer par de douceur, car JFrame implements java.io.L'interface Serializable. c contiendra une Classe de l'objet représentant la classe JFrame.

Bien sûr, les importations nécessaires doivent être inclus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X