我在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;
}
......
}
请给我建议如何避开这个问题。Im是一个泛型noob
您正在将Object[]
强制转换为Node[]
:
Node[] list = (Node[]) new Object[M]; // classcast exception
简单的解决方案是只创建一个Node[]
:
Node[] list = new Node[M];
然而,由于这里解释的原因,这失败了:
无法创建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>
派生出它的类型。你可以在这里阅读更多关于泛型的内容。
Node
是一个非静态嵌套类。这意味着它在外部类的类型参数的范围内,并且被该类型参数有效地"参数化",即使它不直接在Node
上。
当您在ModdedSeperateChainingAlternate
中编写一个空的Node
时,它隐含地表示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];