new String[]{"s","s"}
è di tipo String[]
, non String
. T[]
non è una sottoclasse di T
(a meno che lo T
non sia il Object
).
Object[]
è un sottotipo di Object
, motivo per cui il primo funziona. Infatti, tutti i tipi di array sono subtype of Object
, compresi, forse a sorpresa, gli array di primitivi, come int[]
, anche se int
non è un Object
(*).
Si potrebbe scrivere il primo utilizzando i tipi più specifici:
Object[] c = new Object[] {1,2,"22" };
È possibile scrivere il secondo come una delle seguenti:
String[] s1 = new String[]{"s","s"};
Object[] s2 = new String[]{"s","s"};
Object s3 = new String[]{"s","s"};
Per inciso, s2
dimostra che gli array in Java è covariante. Questo è un problema, dal momento che si può legalmente scrivere:
s2[0] = new Object();
che fallire in fase di esecuzione con una ArrayStoreException
, dal momento che non è possibile memorizzare Object
riferimenti in un String[]
.
Questo è uno dei motivi per cui autori come Josh Bloch danno il consiglio "Preferisco le liste per gli array" (vedi Effective Java 2 ° Ed Articolo 25), dal momento che le collezioni di Java come List
non sono covarianti, e quindi non fare subire lo stesso problema
(*) solo per aggiungere alla confusione, gli array primitivi non sono sottotipi di Object[]
, come primitivi non sono sottotipi di Object
. Ad esempio, sarebbe un errore di compilazione a scrivere:
Object[] illegal = new int[5];
'new String [] { "s", "s"}' è di tipo 'String []', 'non STRING'. 'Object []' è una sottoclasse di 'Object', che è il motivo per cui il primo funziona. –
String [] s = new String [] {"s", "s"}; – star
@AndyTurner Ok, quindi 'String []' non è sottoclasse di 'String'. –