我在Java中创建一个使用外部类的内部类'参数化类型作为实例字段。 现在当我尝试创建这个内部类的数组时,我得到了classcast异常
class ModdedSeperateChainingAlternate<Key, Value> extends SeperateChainingHashST<Key, Value> {
int N;
int M;
Node[] list = (Node[]) new Object[M]; // classcast exception
class Node {
Node next;
Key key;
Value value;
int n;
public Node(Key k, Value v, Node next) {
this.key = k;
this.value = v;
this.next = next;
}
......
}
请告诉我如何解决这个问题。我是一个普通的菜鸟
答案 0 :(得分:4)
您正在向Object[]
投射Node[]
:
Node[] list = (Node[]) new Object[M]; // classcast exception
直接的解决方案是创建一个Node[]
而不是:
Node[] list = new Node[M];
但是,由于解释here:
的原因,此操作失败无法创建TWTestCase.ModdedSeperateChainingAlternate.Node的通用数组
因此,要实现目标,您需要使用一些Collection
,最好是List
:
List<Node> list = new ArrayList<Node>(M);
当你在它的时候,实例变量应该是根据Java标准的驼峰案例:
int m;
此外,int m
将具有默认的整数值,即0
。换句话说,您将创建一个零长度数组。确保已初始化变量(例如int i = 5
)。
对于泛型部分,Node
从ModdedSeperateChainingAlternate<Key, Value>
派生类型。您可以阅读有关泛型here的更多信息。
答案 1 :(得分:1)
Node
是一个非静态嵌套类。这意味着它在外部类的类型参数的范围内,并且由该类型参数有效地“参数化”,即使它不直接在Node
上。
当你在Node
内写一个空ModdedSeperateChainingAlternate
时,它隐含地表示ModdedSeperateChainingAlternate<Key, Value>.Node
,这是一个参数化类型。您无法创建参数化类型的数组,例如你做不到new ArrayList<String>[M]
;出于同样的原因,你不能new Node[M]
(相当于new ModdedSeperateChainingAlternate<Key, Value>.Node[M]
)。
相反,您可以这样做:
创建一个原始类型的数组,如new ArrayList[M]
。但是在这种情况下你怎么写原始类型?它不是我们所见的Node
。相反,您必须使用原始外部类型明确限定它:
Node[] list = new ModdedSeperateChainingAlternate.Node[M];
或者,创建一个使用所有通配符参数化的类型数组,例如new ArrayList<?>[M]
。在这种情况下,它将是:
Node[] list = (Node[])new ModdedSeperateChainingAlternate<?, ?>.Node[M];