2013-04-24 74 views
7

我正在尝试使用链接编写哈希表的数据结构。当我从嵌套类中删除关键字“静态”时,出现“无法创建SeparateChaining.Node的通用数组”的错误?在我分配内存使用新的Hmap的线上。对于泛型外部类,为什么我需要声明嵌套类是静态的?

使用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; 
     } 

    } 

感谢

+0

不应将'key'的类型设置为'Key',并将'value'的类型设置为'Value'(而不是'Object')?和构造函数参数一样吗? – Dukeling 2013-04-24 19:06:04

回答

6

如果将内部Node类声明为static,那么该类将与外部类SeparateChaining关联。然后Node实际上是SeparateChaining.Node

如果没有static,它将与SeparateChaining的一个实例相关联,这将需要几个类型参数,因此内部Node类也将需要这些类型参数。 Node然后实际上是SeparateChaining<Key, Value>.Node;在Java中,creating an array of generics是不合法的。

+0

添加到上面它的作品,如果你尝试和构造节点 IndoKnight 2013-04-24 19:00:29

+0

@Dukeling这会改变程序的意义有点,是吗? – 2013-04-24 19:04:01

+0

在这种情况下,Node的类型参数将与外部'SeparateChaining'的类型参数不同;它会影响该值,而不是使用它。 – 2013-04-24 19:09:08

0

嗯,这是通用的。如果内部类不是静态的,那么类型是SeparateChaining<Key,Value>.Node。当您添加静态时,则将其视为类似普通类

-1

Keyowrd static在嵌套类的声明中表示“我不想引用外部类的对象,非常感谢你”。如果你不把static,那么内部类的任何对象都有一个对外部类的某个对象的引用。

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

相关问题