web-dev-qa-db-fra.com

java - Comment vérifier si mon objet est de type d'une classe donnée?

Ma méthode obtient Class comme paramètre et je dois vérifier que mes variables sont de type class.

Volvo v1 = new Volvo();
Class aClass = v1.getClass();
check(aClass);

à l'intérieur, je dois faire quelque chose comme

   v2 instanceof aClass  ? "True" : "False");

mais cela ne compile pas.

22
Bick

Je pense que vous voulez aClass.isInstance( v2 ). Le les documents disent que cela fonctionne de la même manière que le mot clé instanceOf . Je suppose qu'ils ne peuvent pas utiliser instanceOf comme nom de méthode car les mots clés ne peuvent pas être utilisés comme noms de méthode.

v2 = ???
Volvo v1 = new Volvo();
Class aClass = v1.getClass();
aClass.isInstance( v2 )       // "check(aClass)"

Ou peut-être utilisez simplement un littéral de classe, si "Volvo" est une constante.

v2 = ???
Volvo.class.isInstance( v2 );
30
markspace
    Volvo v = new Volvo();
    if (v instanceof Volvo) {
        System.out.println("I'm boxy, but safe.");
    }
16
cjcdoomed

Comme l'a mentionné Hovercraft Full Of Eels, vous pouvez généralement éviter de tels appels de méthode explicites en vous appuyant sur le compilateur pour effectuer la vérification à votre place. Quelques approches:

  • Vous écrivez un conteneur d'une chose typiquement générique. Laissez le type de chose être T, puis Java vous permet d'exprimer ceci comme suit:

    public class MyClass<T> { private T thing; public void setThing(T t) { this.thing = t; } private void check(Class<T> cls) {} // probably not necessary }

    Créez ensuite des instances de MyClass<T> Comme suit: MyClass<Volvo> m = new MyClass<Volvo>(); ou depuis Java 7: MyClass<Volvo> m = new MyClass<>();

  • Vous avez vraiment besoin de la classe, disons parce que vous travaillez avec des types Enum et beaucoup de ces méthodes paramétrées à l'aide de la classe appropriée:

    public void check(Class<?extends SuperType> validClsAutomaticallyChecked) {}

  • Vous avez juste besoin qu'un objet d'un sur-type spécifique soit transmis à la méthode:

    public void pass(SuperType thatSimple) {}

  • Vous n'avez pas besoin, ne pouvez pas ou ne ferez pas que votre classe contenante accepte un paramètre de type de la chose à transmettre, mais vous voulez toujours utiliser les génériques dans votre méthode. Cela peut être utile pour permettre au compilateur de déduire que ce que vous faites à l'intérieur du corps de la méthode est sûr. Par exemple, vous pouvez créer une collection d'objets de type T en fonction du type d'objet passé en paramètre à la méthode.

    public <T> void workWith(T genericallyTypedObject) {}

4
user268396

Vous pouvez également essayer:

aClass.isAssignableFrom(v2.getClass())

Où "aClass" est une superclasse de "v2"

1
frankfg