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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top