Для универсального внешнего класса, почему мне нужно объявлять вложенный класс статическим?

Я пытаюсь написать структуру данных для хеш-таблицы, используя цепочку. Когда я удаляю ключевое слово «статический» из вложенного класса, я получаю сообщение об ошибке «Невозможно создать общий массив для разделения цепочки. Узел»? в строке, где я выделяю память для hmap, используя new.

Со статическим ключевым словом все работает нормально. Может ли кто-нибудь указать значение ключевого слова 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;
        }

    }

Спасибо


person Himanshu Dewan    schedule 24.04.2013    source источник
comment
Разве тип key не должен быть Key, а тип value не должен быть Value (а не Object)? И то же самое для параметров конструктора?   -  person Bernhard Barker    schedule 24.04.2013


Ответы (3)


Если вы объявите внутренний класс Node как static, то класс будет связан с внешним классом SeparateChaining. Node тогда на самом деле SeparateChaining.Node.

Без static он будет связан с экземпляром SeparateChaining, которому потребуется пара параметров типа, поэтому внутреннему классу Node также потребуются эти параметры типа. Node тогда на самом деле SeparateChaining<Key, Value>.Node; а в Java создание массива дженериков не является законным.

person zw324    schedule 24.04.2013
comment
Добавление к вышесказанному работает, если вы попытаетесь построить Node‹Key,Value› - person IndoKnight; 24.04.2013
comment
@Dukeling Это немного изменит смысл программы, я прав? - person zw324; 24.04.2013
comment
В этом случае параметр типа узла не будет таким же, как параметр типа внешнего SeparateChaining; он будет скрывать это значение вместо того, чтобы использовать его. - person zw324; 24.04.2013
comment
В дополнение к вышесказанному, он работает (компилируется), если вы пытаетесь построить массив как new SeparateChaining.Node[m]. - person Bernhard Barker; 24.04.2013
comment
@Indoknight Вы имеете в виду построение массива как new Node<Key,Value>[m]? Это не работает. - person Bernhard Barker; 24.04.2013

Ну, это общее. Если внутренний класс не является статическим, то тип — SeparateChaining<Key,Value>.Node. Когда вы добавляете static, он обрабатывается как обычный класс.

person Pavel Rozenblioum    schedule 24.04.2013

Keyowrd static в объявлении вложенного класса означает "Я не хочу иметь ссылку на объект внешнего класса, большое спасибо". Если не поставить static, то любой объект внутреннего класса имеет ссылку на какой-то объект внешнего класса.

Таким образом, объект внутреннего нестатического класса может быть создан только внутри нестатического метода объекта внешнего класса.

person Joker_vD    schedule 24.04.2013