ClassCastException
j'ai deux classes en java:
class A {
int a=10;
public void sayhello() {
System.out.println("class A");
}
}
class B extends A {
int a=20;
public void sayhello() {
System.out.println("class B");
}
}
public class HelloWorld {
public static void main(String[] args) throws IOException {
B b = (B) new A();
System.out.println(b.a);
}
}
au moment de la compilation, il ne donne pas d'erreur, mais à l'exécution, il affiche une erreur :
Exception in thread "main" java.lang.ClassCastException: A ne peut pas être jeté à B
Vous devez vous connecter pour publier un commentaire.
Cela se produit parce que le au moment de la compilation type d'expression de
new A()
estA
- qui pourrait être une référence à une instance deB
, de sorte que la distribution est autorisée.Au moment de l'exécution, cependant, la référence est juste pour une instance de
A
- donc il échoue le casting. Un exemple de justeA
n'est pas une instance deB
. Le casting fonctionne uniquement si la référence n'a vraiment se référer à une instance deB
ou une sous-classe.B extends A et donc B peut être jeté comme A. par contre, l'inverse n'est pas vrai. Une instance de A ne peut pas être jeté comme B.
Si vous êtes dans le Javascript du monde vous attend peut-être que cela fonctionne, mais Java n'a pas de "duck-typing".
D'abord de faire comme ceci :
Maintenant faire votre cast Explicite, il va travailler:
Qui signifie Explicite du casting devez avoir besoin de conversion implicite. elsewise Explicite casting n'est pas autorisé.
Une fois que vous créez l'objet d'une classe enfant vous ne pouvez pas enfermé dans une super-classe. Il suffit de regarder dans les exemples ci-dessous
Hypothèses:
Le chien est l'enfant de la classe qui hérite de l'Animal(super-classe)
Normal Transtypage:
Mal Catalogué:
Ci-dessous Transtypage fonctionne vraiment:
Un compilateur vérifie la syntaxe c'est pendant le temps d'exécution contenu sont effectivement vérifiées