2016-04-18 64 views
7

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?

+5

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

+2

Vorrei che questa fosse la risposta. – totoro

+0

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. –

risposta

10

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

+0

Potresti incorporare il "bypass dei generici" e mostrare con i generici è davvero omogeneo nella risposta? – totoro

+0

"Il seguente compila e gira senza problemi" Mentre questo verrà compilato, riceverai un avvertimento durante la compilazione. – Powerlord

0

Sì. JavaArrays 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 Objectclass, 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.