Se abbiamo un tipo [], possiamo memorizzare solo il tipo oi suoi sottotipi. Lo stesso vale per ArrayList. Allora perché si dice che uno è omogeneo mentre l'altro no?Che cosa significa che gli array Java sono omogenei, ma non gli ArrayList?
risposta
Le matrici hanno un controllo di runtime sul tipo dell'elemento aggiunto. Cioè, se viene aggiunto un nuovo elemento che non è dello stesso tipo, viene generato un ArrayStoreException
in fase di runtime. Ecco perché sono considerati "omegene".
Questo non è vero per ArrayList
s (s in generale). A causa della cancellazione del tipo in fase di esecuzione, può praticamente contenere qualsiasi oggetto.
Il seguente genera un'eccezione durante l'esecuzione:
Object[] array = new String[3];
array[0] = "a";
array[1] = 1; // throws java.lang.ArrayStoreException
a differenza di quanto segue che riunisce e gestisce senza problemi (anche se con un avviso del compilatore in quanto non usa correttamente i farmaci generici):
ArrayList list = new ArrayList<String>();
list.add("a");
list.add(1); // OK
list.add(new Object()); // OK
Con un uso corretto di generici, ovvero dichiarando la variabile al posto di ArrayList<String>
anziché ArrayList
, il problema viene evitato in fase di compilazione:
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add(1); // compilation error
list.add(new Object()); // compilation error
Ma anche con una lista genericamente dichiarata, si può avere qualcosa di simile a questo lavoro senza un'eccezione in fase di esecuzione:
ArrayList<String> list = new ArrayList<String>();
list.add("a");
Method[] methods = List.class.getMethods();
for(Method m : methods) {
if(m.getName().equals("add")) {
m.invoke(list, 1);
break;
}
}
System.out.println(list.get(0));
System.out.println((Object) list.get(1));
uscita:
un
Sì. Java
Arrays
sono omogenei, perché quando si dichiara qualsiasi array in Java è necessario dichiarare il suo type
. esempio:
int arr[]; //type is int
String arr[]; //type is String
float arr[]; //type is float
ora se si tenta di memorizzare qualsiasi altro tipo di dato in matrice dichiarata, sarà un errore di tempo di compilazione. esempio:
int arr=new int[5];
arr[0]="I am a String not int"; //compile time error
ma ArrayList
fanno parte s' il Collection
, tengono Objects
, invece di qualsiasi specifica data-type
[se non stiamo parlando di generics
], e perché ogni cosa in java è direttamente o indirettamente ereditate da Object
class
, quindi non ti darà il controllo di tipo compile-time error,
sarà su run-time
.
esempio:
ArrayList al=new ArrayList();//type is Object
al.add("I am a String"); //Bacause String class in inherited from Object Class
al.add(1);//the int 1 will first autobox into Integer class then stored in al ArrayList.Now bacause Integer class is also inherited from Object class,it will*/ allow you to store
al.add(UserDefinedClass); //because every User defined class is also inherited from Object class,so it will also allow you.
Ora ti sei accorto, perché non abbiamo definito alcun tipo di dati di ArrayList al
, ma ancora ci sono la memorizzazione di valori di tipo diverso: si tratta di sapere perché ArrayList
Negozi Object
non specifica i dati di tipo , quindi sono eterogenei non omogenei.
Chi ti ha detto che le liste array non sono omogenee? Finché non bypassare i generici, sono esattamente omogenei come array. (Se * fai * bypassare i generici, dovresti probabilmente confrontare con 'Object []'.) – user2357112
Vorrei che questa fosse la risposta. – totoro
Ogni elemento di qualsiasi matrice deve essere lo stesso tipo primitivo o lo stesso tipo di riferimento. Ogni elemento di un ArrayList deve essere lo stesso tipo di riferimento. –