puoi downcast oggetti in Java senza dichiarare una nuova variabile?
-
27-10-2019 - |
Domanda
Stavo cercando di fare qualcosa del genere
class O has a child E
Dichiaro la variabile
O xyz = new E();
ma poi se chiamo xyz.method(), posso chiamare solo quelli nei metodi della classe O, non quelli E, quindi posso downcast con
E xyz2 = (E) xyz;
La mia domanda è: puoi farlo senza dichiarare una nuova variabile?Qualcosa di simile a:
O xyz = new E();
xyz = (E) xyz;
e ora posso usare xyz.method() per chiamare i metodi di E
C'è un modo per farlo in Java?
Soluzione
Sì, puoi abbattere
((E)xyz).method();
Altri suggerimenti
No, non puoi modificare il tipo di una variabile dopo che è stata dichiarata.
Puoi incorporare i typecast, risparmiando un po' di digitazione se devi eseguire il downcast solo una volta:
Number n = 1;
((Integer)n).someIntegerMethod();
Probabilmente dovresti creare una nuova variabile se hai bisogno di farlo più di una volta, però.Il compilatore potrebbe o meno essere abbastanza intelligente da ottimizzarlo correttamente in caso contrario (e si incorrerebbe nel sovraccarico di runtime del casting ripetuto delle classi).
Se la classe genitore (O) avesse anche un metodo XYZ, potresti semplicemente chiamare
O xyz = new E();
xyz.method(); // E's xyz would be called
Questo è polimorfismo
Non puoi farlo in questo modo:
O xyz = new E();
xyz = (E) xyz;
xyx.someEMethod(); // compilation error
Il motivo è che i tipografi degli oggetti Java non cambiano in realtà alcun valori. Piuttosto, eseguono un controllo di tipo contro il tipo effettivo dell'oggetto.
Il tuo codice controlla il valore di xyz
è un E
, ma poi assegna il risultato del typecast a xyz
(Seconda dichiarazione), così aggiornandolo a un O
ancora.
Tuttavia, puoi farlo:
((E) xyx).someEMethod(); // fine
Le parentesi attorno al typecast sono essenziali, perché "". L'operatore ha una precedenza maggiore rispetto a un tipografico.