2013-11-03 73 views
3

有一個在代碼說法不能創建E. 的通用陣列任何人都可以幫助我在此感謝圓陣隊列錯誤

**Q = new E[N];** 

以下是完整的代碼中的錯誤;

package org.circular; 

public class CircularArrayQueue<E> implements QueueADT<E> { 

private static final int capacity = 5; 
private E[] Q; 
private final int N; // capacity 
private int f = 0; 
private int r = 0; 

public CircularArrayQueue() { 
    this(capacity); 
} 

public CircularArrayQueue(int capacity) { 
    N = capacity; 
    Q = new E[N]; 
} 

public int size() { 
    if (r > f) 
     return r - f; 
    return N - f + r; 
} 

public boolean isEmpty() { 
    return (r == f) ? true : false; 
} 

public boolean isFull() { 
    int diff = r - f; 
    if (diff == -1 || diff == (N - 1)) 
     return true; 
    return false; 
} 

public void enqueue(E element) throws FullQueueException { 
    if (isFull()) { 
     throw new FullQueueException("Full"); 
    } else { 
     Q[r] = element; 
     r = (r + 1) % N; 
    } 
} 

public E dequeue() throws EmptyQueueException { 
    E item; 
    if (isEmpty()) { 
     throw new EmptyQueueException("Empty"); 
    } else { 
     item = Q[f]; 
     Q[f] = null; 
     f = (f + 1) % N; 
    } 
    return item; 
} 

@Override 
public E front() throws EmptyQueueException { 
    if (isEmpty()) { 
     throw new EmptyQueueException("Empty"); 

    } 
    return null; 
} 

} 
+0

任何直接的幫助將更有幫助謝謝 – user2877014

+0

如果你可以用arraylist代替,那麼你可以避免做任何不檢查的轉換 –

回答

0

Java不允許創建通用數組。您將必須投它

Q = new (E[]) Object[N]; 
2

錯誤是,在Java中,創建一個不可修飾類型的新實例是非法的。不可修飾類型是在編譯時存在但在運行時不存在的類型。

Java中的泛型是通過擦除來實現的,也就是說所有的泛型類型參數在編譯期間被編譯器擦除。因此,泛型類型信息在運行時不存在。出於這個原因,不允許創建通用數組,因爲編譯器不能保證在運行時數組上的所有操作都是類型安全的。因此,編譯器會產生錯誤。

以下非reifiable類型不能爲數組被Java創建(E是一個泛型類型參數):

  • E[]
  • List<E>[]
  • List<String>[]

可以投一個數組轉換爲泛型類型,程序將編譯...但是,如果出現錯誤,您將收到關於未經檢查的轉換的警告。同樣,類型信息在運行時不存在,所以警告提醒您您的代碼可能不是類型安全的。

您可以使用List<E>代替E[N]來繞過您的問題。由於Java數組是協變的(使數組在運行時可以知道它們的組件類型),而泛型集合是不變的(通用類型信息在運行時不存在;編譯器強制執行類型安全性),所以數組和泛型混合很差。