2016-04-18 48 views
7

Tip [] 'i kullanırsak, yalnızca Türü veya alt türlerini bunun içinde saklayabiliriz. Aynı ArrayList için de geçerli. Öyleyse neden diğerinin değil, neden homojen olduğu söylendi?Java dizilerinin homojen olduğu, ancak ArrayLists'in ne anlama geldiği nedir?

+5

Sana kim söyledi ArrayLists inhomojen? Jenerikleri geçmediğin sürece, tam olarak diziler kadar homojen olurlar. (Eğer * siz * jenerikleri atlarsanız *, o zaman muhtemelen 'Object [] 'ile karşılaştırmalısınız.) – user2357112

+2

Bunun cevabın olmasını isterim. – totoro

+0

Herhangi bir dizinin her öğesinin aynı ilkel tür veya aynı referans türü olması gerekir. Bir ArrayList öğesinin her öğesi aynı referans türü olmalıdır. –

cevap

10

Diziler, eklenen öğenin türü üzerinde bir çalışma zamanı denetimi gerçekleştirir. Yani, aynı türde olmayan yeni bir öğe eklenirse, çalışma zamanında ArrayStoreException atılır. Bu yüzden "evrimsel" olarak kabul edilirler.

Bu ArrayList s (genel olarak List ler) için geçerli değildir. Çalışma zamanında tür silme nedeniyle, herhangi bir nesneyi pratikte tutabilir. derler ve (düzgün jenerikleri kullanmaz gibi bir derleyici uyarı ile rağmen) sorunsuz çalışır Aşağıdakilerden aksine

Object[] array = new String[3]; 
array[0] = "a"; 
array[1] = 1; // throws java.lang.ArrayStoreException 

: çalıştırırken

aşağıdaki bir istisna atar

ArrayList list = new ArrayList<String>(); 
list.add("a"); 
list.add(1); // OK 
list.add(new Object()); // OK 
jenerik bir doğru kullanımı ile

, tip ArrayList<String> yerine ArrayList yukarıdaki değişken list ilan yani sorun derleme sırasında önlenir:

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)); 

Çıktı:

bir

ArrayList<String> list = new ArrayList<String>(); 
list.add("a"); 
list.add(1); // compilation error 
list.add(new Object()); // compilation error 

Ama bir jenerik ilan listeyle, çalışma zamanında bir istisna olmadan bu işi gibi bir şey olabilir

+0

"Jeneriklerin atlatılmasını" ve "jenerik" leri göstererek, cevaplara gerçekten homojen bir şekilde gösterebilir misiniz? – totoro

+0

"Aşağıdaki, derler ve sorunsuz çalışır" Bu derlenecek olsa, derlerken bir uyarı alırsınız. – Powerlord

0

Evet. JavaArrays homojendir, çünkü Java'daki herhangi bir diziyi bildirdiğinizde, type numaralı telefonu bildirmeniz gerekir. örn: Eğer beyan dizide başka veri türü depolamak çalışırsanız

int arr[]; //type is int 
    String arr[]; //type is String 
    float arr[]; //type is float 

şimdi, bir derleme zamanı hatası olacaktır. örn:

int arr=new int[5]; 
    arr[0]="I am a String not int"; //compile time error 

ama ArrayList onlar [yaklaşık generics konuşurken değilse] yerine herhangi bir spesifik data-type arasında Objects tutun ve java her şeydir çünkü doğrudan veya dolaylı miras, Collection 'in parçası olan Objectclass, bu yüzden run-timerun-time üzerinde olacak vermeyecektir size compile-time error, yazın.

örn: Biz ArrayList al herhangi veri türü tanımlı değil çünkü

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. 

Şimdi, fark ettiniz, ama yine de biz farklı tip değerlerini saklamak gibidir: bunu biliyorum neden ArrayList Mağazalar Object değil belirli bir veri tipi Böylece homojen değil heterojendirler.