Comment puis-je effectuer un downcast en toute sécurité et empêcher une ClassCastException

StackOverflow https://stackoverflow.com/questions/3325275

  •  28-09-2020
  •  | 
  •  

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.

Était-ce utile?

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
scroll top