Per questo genere di cose è utile distinguere tra il tipo di una variabile, stabilito nella sua dichiarazione, e la classe di un oggetto, stabilita al momento della creazione dell'oggetto.
Una variabile può essere null
o per puntare a qualsiasi oggetto la cui classe corrisponde al suo tipo o è una sottoclasse diretta o indiretta di tale classe. Poiché String
è una sottoclasse di Object
, una variabile di tipo Object
può puntare a un oggetto della classe String
.
Nel tuo esempio, il compilatore sa che un'espressione String
deve essere null
o scegliere un oggetto String
, così Object o = new String("Hello");
è noto al momento della compilazione corretta.
D'altra parte, un'espressione o una variabile di tipo Object
può fare riferimento a una stringa, ma può fare riferimento a qualcosa di completamente diverso. Il compilatore richiede un cast esplicito per dire che la conversione è OK.
public class Test {
public static void main(String[] args) {
Object stringObject = "xyzzy";
Object integerObject = new Integer(3);
String test1 = (String)stringObject;
System.out.println(test1);
String test2 = (String) integerObject;
System.out.println(test2);
}
}
Questo programma viene compilato perché ho detto al compilatore le conversioni sono OK con i miei calchi.Corre attraverso la prima chiamata println
, perché stringObject
punta davvero a String
. Non riesce con un ClassCastException
sulla riga String test2 = (String) integerObject;
. Per quanto sa il compilatore, integerObject
potrebbe puntare a un String
, quindi ha accettato il mio cast. In fase di esecuzione, la JVM rileva che punta davvero a un Integer
e genera l'eccezione.
L'uso del tipo Object
per interoOggetto è significativo. Ciò rende la conversione String test2 = (String) integerObject;
di un'espressione di tipo type in string String, una conversione che potrebbe riuscire, a seconda di cosa siano effettivamente i riferimenti di integerObject
. Se integerObject
avesse dichiarato il tipo Integer
, il compilatore avrebbe rifiutato il programma. Non esiste un oggetto a cui è possibile fare riferimento tramite entrambe le espressioni Integer
e String
.
fonte
2014-12-15 01:14:30
Il tipo di oggetto sulla destra deve essere o estendere il tipo sulla sinistra. L'oggetto non è una stringa né estende la stringa. – csmckelvey
È necessario trovare un testo di base sulla programmazione orientata agli oggetti e studiarlo. (Scherzi a parte: non capirai i concetti dalle risposte di 100 parole su SO). –