2016-04-08 8 views
0

'u içeren yeni bir dizi oluşturma Generikleri öğretmek için büyük bir örnek geliştiriyorum. Java'daki koleksiyon sınıfını taklit eden bir grup sınıf ve arayüz. İşte kaynak dosyalarının biri:Java Generics

package edu.brandeis.cosi12b.listdemo; 

public class ArrayList<E extends Comparable<E>> extends AbstractList<E> implements List<E> { 
    private E[] list; 
    private int size; 
    private int capacity; 

    public ArrayList() { 
    this(20); 
    } 

    @SuppressWarnings("unchecked") 
    public ArrayList(int initialCapacity) { 
    list = (E[]) (new Object[initialCapacity]); 
    size = 0; 
    capacity = initialCapacity; 
    } 

    public int capacity() { 
    return capacity; 
    } 

    public int size() { 
    return size; 
    } 

    public void add(E val) { 
    list[size] = val; 
    size++; 
    } 

    public String toString() { 
    StringBuffer s = new StringBuffer(); 
    s.append("["); 
    for (int i = 0; i < size - 1; i++) { 
     s.append(list[i]); 
     s.append(", "); 
    } 
    s.append(list[size - 1]); 
    s.append("]"); 
    return (s.toString()); 
    } 

    public void set(int index, E value) { 
    expandIfNecessary(index); 
    for (int i = size; i > index; i--) { 
     list[i] = list[i - 1]; 
    } 
    list[index] = value; 
    if (index > size) 
     size = index + 1; 
    } 

    @SuppressWarnings("unchecked") 
    private void expandIfNecessary(int index) { 
    if (index < capacity) 
     return; 
    int newCapacity = capacity * 2 + index; 
    E[] oldArray = list; 
    list = (E[]) (new Object[newCapacity]); 
    for (int i = 0; i < size; i++) 
     list[i] = oldArray[i]; 
    capacity = newCapacity; 
    } 

    public E get(int index) { 
    if (index < 0 || index >= size) 
     throw new ArrayIndexOutOfBoundsException("i: " + index + " s: " + size); 
    return list[index]; 
    } 

    public void remove(int index) { 
    for (int i = index; i < size; i++) 
     list[i] = list[i + 1]; 
    size--; 
    } 

    public boolean isEmpty() { 
    return size() == 0; 
    } 

    public int indexOf(E value) { 
    for (int i = 0; i < size; i++) { 
     if (list[i] == value) 
     return i; 
    } 
    return -1; 
    } 

    public boolean contains(E value) { 
    return (indexOf(value) != -1); 
    } 

    @Override 
    public void add(int index, E value) { 
    // TODO Auto-generated method stub 
    } 
} 

Ben bu hatayı alıyorum bir test durumunda bu çalıştırdığınızda. Oldukça ince bir şey olduğunu biliyorum ve Java bilgimi aşıyor.

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable; 
    at edu.brandeis.cosi12b.listdemo.ArrayList.<init>(ArrayList.java:14) 
    at edu.brandeis.cosi12b.listdemo.ArrayList.<init>(ArrayList.java:9) 
    at edu.brandeis.cosi12b.listdemo.TestSuite.arrayListtest1(TestSuite.java:134) 
    at edu.brandeis.cosi12b.listdemo.TestSuite.runArrayListTests(TestSuite.java:15) 
    at edu.brandeis.cosi12b.listdemo.TestSuite.runAll(TestSuite.java:9) 
    at edu.brandeis.cosi12b.listdemo.ListDemo.runTests(ListDemo.java:13) 
    at edu.brandeis.cosi12b.listdemo.ListDemo.main(ListDemo.java:6) 
+0

'(E []) (yeni Object [initialCapacity]) deyimi, öğrencilerin bir çok konuyla karşılaşacağı bir şeydir. Diğer ortak konu, “E []' nin, dış dünyaya da bir istisna atmasıdır. – Radiodef

cevap

6

Kullanım

list = (E[]) new Comparable<?>[initialCapacity]; 

ve

list = (E[]) (new Comparable<?>[newCapacity]); 
aslında E ne olduğunu bilmiyor böylece Java zamanında tam şeyleşmiş Generics'i yok

, (o silinmesini kullanır) - sadece Comparable'u genişletir, bu yüzden derleyicinin dökümler için eklediği şeydir.

kodunuz için derleyici tarafından oluşturulan bayt kodu bozulamaz ise aşağıdaki gibidir: başarısız

list (Comparable[]) new Object[initialCapacity]; 

.

+2

Daha teknik olarak, bir tür değişkenin silinmesi en sol sınırının silinmesidir. Parametrelenmiş tipin silinmesi ham tipidir, bu nedenle <> 'in karşılaştırması '' Karşılaştırılabilir' 'dir. https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.6 – Radiodef

+0

Beautiful.Thanks. Ve çok karmaşık ... – pitosalas