[英]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.