Giovx24 ha scritto:
no non saprei, mi aspetterei un errore alla terza riga
objArr[0] = new Integer(123);
perchè stiamo cercando si assegnare un intero ad una stringa.
Sì, più o meno ci sei. Ma la vera spiegazione è la seguente.
Quando crei un array di String con es.
new String[10] sul heap-space, in memoria, oltre allo spazio per i 10 elementi, la JVM mantiene all'interno dell'oggetto array anche le informazioni sul tipo. Ovvero c'è scritto in un qualche modo "i miei elementi sono di tipo String". E questa informazione viene USATA dalla JVM per controllare ad ogni assegnamento degli elementi se il tipo è corretto.
Quando fai:
Object[] objArr = strArr;
questo è lecito per le regole di Java. Avendo un Object[], teoricamente potrebbe contenere qualunque cosa. Ma l'array realmente istanziato è un String[] e le informazioni su questo tipo ci sono tutte. Ovvero gli array sono "completamente rappresentati" a runtime.
Quindi quando tenti di fare:
objArr[0] = new Integer(123);
ti becchi un
ArrayStoreException, la JVM grazie a quelle informazioni mantenute nell'array, verifica che Integer non è compatibile con String e lancia questa eccezione specifica per questo.
Ora, vediamo i generics, con un List (ma sarebbe similare per qualunque altro tipo):
List<String> strList = new ArrayList<String>(); // OK
Se (e ripeto SE) la seguente riga fosse lecita (NON lo è in realtà):
List<Object> objList = strList;
tu poi potresti "tentare" di mettere nel List<Object> dei Integer. E .... ci riusciresti. Perché quando fai new ArrayList<String>(), all'interno dell'oggetto ArrayList NON c'è alcuna informazione che dica "i miei elementi sono di tipo String". Questo è dovuto alla "erasure", a come sono implementati i generics.
Se fosse possibile, si potrebbe combinare casini nella lista. E tutta la teoria dei generics andrebbe a farsi friggere in padella ....
Questo in sostanza è il motivo per cui è stato PROIBITO che List<String> sia un sottotipo di List<Object>.