web-dev-qa-db-fra.com

Comment identifier les types d'objets dans java

Duplicata possible:
Comment déterminer la classe d'un objet (en Java)?
Java détermine de quelle classe est un objet

J'ai un exemple de méthode incomplète pour comparer le type d'objet d'un objet donné

public void test(Object value) {

        if (value.getClass() == Integer) {
            System.out.println("This is an Integer");
        }else if(value.getClass() == String){
            System.out.println("This is a String");
        }else if(value.getClass() == Float){
            System.out.println("This is a Float");
        }

}

La méthode peut être appelée comme:

test("Test");
test(12);
test(10.5f);

cette méthode ne fonctionne pas réellement, veuillez m'aider à la faire fonctionner

19
Harsha

Vous avez oublié le .class:

if (value.getClass() == Integer.class) {
    System.out.println("This is an Integer");
} 
else if (value.getClass() == String.class) {
    System.out.println("This is a String");
}
else if (value.getClass() == Float.class) {
    System.out.println("This is a Float");
}

Notez que ce type de code est généralement le signe d'une mauvaise conception OO.

Notez également que comparer la classe d'un objet avec une classe et utiliser instanceof n'est pas la même chose. Par exemple:

"foo".getClass() == Object.class

est faux, alors que

"foo" instanceof Object

est vrai.

L'utilisation de l'un ou de l'autre dépend de vos besoins.

37
JB Nizet

Vous pouvez comparer les jetons de classe les uns aux autres, vous pouvez donc utiliser value.getClass() == Integer.class. Cependant, la manière la plus simple et la plus canonique est d'utiliser instanceof:

    if (value instanceof Integer) {
        System.out.println("This is an Integer");
    } else if(value instanceof String) {
        System.out.println("This is a String");
    } else if(value instanceof Float) {
        System.out.println("This is a Float");
    }

Remarques:

  • la seule différence entre les deux est que la comparaison des jetons de classe détecte uniquement les correspondances exactes, tandis que instanceof C correspond également aux sous-classes de C. Cependant, dans ce cas, toutes les classes répertoriées sont final, elles n'ont donc pas de sous-classes. Ainsi, instanceof est probablement bien ici.
  • comme l'a déclaré JB Nizet, ces vérifications ne sont pas OO design. Vous pouvez peut-être résoudre ce problème de manière plus OO, par exemple.

    System.out.println("This is a(n) " + value.getClass().getSimpleName());
    
14
Péter Török

Vous voulez instanceof:

if (value instanceof Integer)

Cela sera vrai même pour les sous-classes, ce qui est généralement ce que vous voulez, et c'est également null-safe. Si vous avez vraiment besoin de la même classe, vous pouvez le faire

if (value.getClass() == Integer.class)

ou

if (Integer.class.equals(value.getClass())
5
Thilo

Utilisation value instanceof YourClass