对于一个通用的外部类,为什么我需要声明嵌套类为静态的?

7
我正在尝试使用链接法(Chaining)为哈希表编写数据结构。当我从嵌套类中删除 "static" 关键字时,我在给 hmap 分配内存的行上收到错误消息 "Cannot create a generic array of SeparateChaining.Node"?
加上 static 关键字后就正常工作了。请问这里 static 关键字的重要性是什么,它有什么区别?我正在创建对象数组,那么为什么错误会显示“通用数组”(Eclipse)?
public class SeparateChaining<Key,Value> {

    private int m;

    private Node[] hmap;

    private int n;

    public SeparateChaining()
    {
        m=5;
        n=0;

        //error here on removal of static keyword from the node  class declaration
                hmap=new Node[m];

    }

    private ____ class Node //works fine with static. Otherwise shows error
    {
        private Object key;
        private Object value;
        private Node next;

        public Node(Object k, Object v)
        {

            key=k;
            value=v;
        }

    }

谢谢


key 的类型应该是 Key,而 value 的类型应该是 Value(而不是 Object)?构造函数参数也是同样的情况吗? - Bernhard Barker
3个回答

6
如果您将内部的Node类声明为static,则该类将与外部类SeparateChaining相关联。然后Node实际上是SeparateChaining.Node
没有static,它将与SeparateChaining的一个实例相关联,该实例将需要一些类型参数,因此内部的Node类也将需要这些类型参数。然后Node实际上是SeparateChaining<Key, Value>.Node;在Java中,创建泛型数组是不合法的

除此之外,如果您尝试构建Node<Key,Value>,它也可以正常工作。 - IndoKnight
@Dukeling 那会稍微改变程序的意义,我说得对吗? - zw324
在这种情况下,Node的类型参数将不同于外部SeparateChaining的类型参数;它将遮蔽该值,而不是使用它。 - zw324
1
除此之外,如果您尝试构建数组为new SeparateChaining.Node[m],它可以正常工作(编译)。 - Bernhard Barker
@Indoknight 你的意思是将数组构建为 new Node<Key,Value>[m] 吗?这样是行不通的。 - Bernhard Barker

0
好吧,它是通用的。如果内部类不是静态的,那么类型就是SeparateChaining.Node。当你添加static时,它就被视为普通类。

-1

在嵌套类的声明中使用关键字static表示“我不想要一个指向外部类对象的引用,非常感谢”。如果不加static,则内部类的任何对象都会引用外部类的某个对象。

因此,非静态内部类的对象只能在外部类对象的非静态方法中创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接