簡體   English   中英

java中內部類初始化的泛型數組

[英]generic array of inner class initialization in java

有沒有辦法讓以下代碼在Java中工作?

public class RandomizedQueue<Item> implements Iterable<Item> {  
    private static final int ARRAYSIZE = 8; // default array size
    private Node[] nodeArray;               // contains pointers to the randomized nodes    
    private int size;                       // current size of queue

    private class Node
    {
        private Item item;
        private Node next;
        private Node previos;
    }

    @SuppressWarnings("unchecked")
    public RandomizedQueue()           // construct an empty randomized queue
    {
        nodeArrays = (Node[]) new Object[ARRAYSIZE]; // fix this and everything works!
    }

    // unimportant randomized queue implementation details
    // ...
}

它在nodeArray初始化行的運行時崩潰,出現以下錯誤:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LRandomizedQueue$Node; at RandomizedQueue.<init>(RandomizedQueue.java:18) at Subset.main(Subset.java:6) Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LRandomizedQueue$Node; at RandomizedQueue.<init>(RandomizedQueue.java:18) at Subset.main(Subset.java:6)

問題是我不能使用像ArrayList <>這樣的庫數據結構,因為我必須有自定義的重新調整大小規則。 另外,我自己也無法實現ArrayList analogue(我的任務中不允許使用其他類)。

Code nodeArray = new Node[ARRAYSIZE]; 不能在Eclipse中編譯錯誤Cannot create a generic array of RandomizedQueue<Item>.Node

你的問題是這樣的:

公共類RandomizedQueue實現Iterable {
[...]私人班級節點{私人物品項目;

首先,您可能希望使用[靜態]嵌套類而不是內部類。 Item是一個通用參數,由於您沒有使用標准編碼約定,因此不明顯。 Node需要一個通用參數。 所以:

公共類RandomizedQueue實現Iterable {
[...]私有靜態類Node {私有U項;

所以現在你想要一個Node<U>的數組。 通常情況下,我會說使用List<Node<U>> ,但我認為你在這里嘗試某種低級效率。 所以我們需要制作一個原型的狡猾數組並投射到泛型上。

       Node<T>[] nodeArrays = (Node<T>[])new Node[ARRAYSIZE];

假設您確實想直接分​​配到該字段:

       nodeArrays = (Node<T>[])new Node[ARRAYSIZE];

可能更好的方法是使Node非泛型,然后轉換為“gets”。

    private static class Node {
       [...]
       Node[] nodeArrays = new Node[ARRAYSIZE];
    [...]
    private T at(int index) {
        return (T)nodeArrays[index];
    }

順便說一句:如果你打算抑制警告,只能抑制一行。 這可能需要引入臨時變量。

Node是一個非靜態內部類,這意味着它在外部類的泛型參數的范圍內,這也意味着它使用外部類的泛型參數進行隱式參數化。

RandomizedQueueNode表示RandomizedQueue<Item>.Node 這意味着它是一個參數化類型。 您無法在Java中創建參數化類型的數組。 您只能創建原始類型或通配符參數化類型的數組。

那么Node的原始類型是什么? (這不僅僅是我之前解釋的Node 。)您必須使用外部類名顯式限定它: RandomizedQueue.Node

所以解決方案是創建一個原始類型的數組:

nodeArrays = (Node[]) new RandomizedQueue.Node[ARRAYSIZE];

或通配符參數化類型:

nodeArrays = (Node[]) new RandomizedQueue<?>.Node[ARRAYSIZE];

你應該這樣做。

Node[] nodeArrays = new Node[ARRAYSIZE];

不要創建局部變量Node[] nodeArrays = (Node[]) new Object[ARRAYSIZE]; RandomizedQueue()構造函數中。

@SuppressWarnings("unchecked")
public RandomizedQueue()           
{
     nodeArray = new Node[ARRAYSIZE]; Now This is fixed 
}

另請參閱內部類Node的參數化。

class RandomizedQueue<Item> implements Iterable<Item> {
private static final int ARRAYSIZE = 8; // default array size
private Node[] nodeArray; // contains pointers to the randomized nodes
private int size; // current size of queue

private class Node<Item> {
    private Item k;
    private Node next;
    private Node previos;

}

public RandomizedQueue() // construct an empty randomized queue
{
    super();
    nodeArray = new Node[ARRAYSIZE];
}

@Override
public Iterator<Item> iterator() {
    // TODO Auto-generated method stub
    return null;
}
}

內心階級

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM