Java内部类使用外部类'参数化类型

时间:2015-03-06 10:19:35

标签: java generics

我在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;
        }
        ......
    }

请告诉我如何解决这个问题。我是一个普通的菜鸟

2 个答案:

答案 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)。

对于泛型部分,NodeModdedSeperateChainingAlternate<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];