[英]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
是一個非靜態內部類,這意味着它在外部類的泛型參數的范圍內,這也意味着它使用外部類的泛型參數進行隱式參數化。
在RandomizedQueue
, Node
表示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.