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.
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 );
Volvo v = new Volvo();
if (v instanceof Volvo) {
System.out.println("I'm boxy, but safe.");
}
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) {}
Vous pouvez également essayer:
aClass.isAssignableFrom(v2.getClass())
Où "aClass" est une superclasse de "v2"