Comment puis-je effectuer un downcast en toute sécurité et empêcher une ClassCastException
Question
J'ai le scénario suivant :
public class A {
}
public class B extends A {
}
public class C extends B {
public void Foo();
}
J'ai une méthode qui peut renvoyer une classe UN, B ou C et je veux lancer un cast en toute sécurité vers C mais seulement si le type de classe est C.C'est parce que je dois appeler Foo() mais je ne veux pas de ClassCastException.
La solution
Pouvez-vous faire cela?
if (obj instanceof C) {
((C)obj).Foo();
}
else {
// Recover somehow...
}
Cependant, veuillez consulter certains des autres commentaires dans cette question, car une surutilisation de instanceof
est parfois (pas toujours) un signe que vous devez repenser votre conception.
Autres conseils
Vous pouvez vérifier le type avant de jeter l'instanceOf
Object obj = getAB_Or_C();
if ( obj instanceof C ) {
C c = (C) obj;
}
Ce que vous devriez faire est quelque chose comme ce qui suit, alors vous n'avez pas besoin de lancer.
public class A {
public void foo() {
// default behaviour.
}
}
public class B extends A {
}
public class C extends B {
public void foo() {
// implementation for C.
}
}
Comme alternative à instanceof
, considérer
interface Fooable { void foo(); }
class A implements Fooable { ... }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow