pouvez-vous downcaster objets en java sans déclarer une nouvelle variable?
-
27-10-2019 - |
Question
Je suis en train de faire quelque chose comme
class O has a child E
Je déclare la variable
O xyz = new E();
mais si je l'appelle xyz.method (), je ne peux appeler ceux dans les méthodes de la classe O, et non E de, donc je peux downcaster par
E xyz2 = (E) xyz;
Ma question est- Pouvez-vous faire cela sans déclarer une nouvelle variable? Quelque chose comme:
O xyz = new E();
xyz = (E) xyz;
et maintenant je peux utiliser xyz.method () pour appeler les méthodes de E
Est-il possible de le faire en java?
La solution
oui, vous pouvez downcaster
((E)xyz).method();
Autres conseils
Non, vous ne pouvez pas changer le type d'une variable après elle est déclarée.
Vous pouvez inline les typecasts, ce qui permet d'économiser de la frappe si vous devez seulement une fois baissés:
Number n = 1;
((Integer)n).someIntegerMethod();
Vous devriez probablement créer une nouvelle variable si vous devez le faire plus d'une fois, cependant. Le compilateur peut ou peut ne pas être assez intelligent pour optimiser ce bien autrement (et vous encourrait les frais généraux d'exécution de la coulée de classe répétée).
si la classe parente (O) a une xyz méthode aussi bien, vous pourriez l'appeler simplement
O xyz = new E();
xyz.method(); // E's xyz would be called
est polymorphisme
Vous ne pouvez pas le faire comme ceci:
O xyz = new E();
xyz = (E) xyz;
xyx.someEMethod(); // compilation error
La raison en est que typecasts d'objets Java ne changent pas réellement de valeur. Au contraire, ils effectuent un contrôle de type contre le type réel de l'objet.
Vos code vérifie que la valeur de xyz
est un E
, mais affecte ensuite le résultat de l'arrière de typecast à xyz
(deuxième déclaration), ainsi revenir transtypage ascendant à un O
nouveau.
Cependant, vous pouvez faire ceci:
((E) xyx).someEMethod(); // fine
Les parenthèses autour de la typecast sont essentielles, parce que le « » l'opérateur a une priorité supérieure transtypage.