繁体   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