Вложенные типы: ошибка: нестатическая переменная, на которую нельзя ссылаться из статического контекста [дубликат]

Вы можете избежать рекурсивных вызовов в стек, используя фактическую структуру данных стека довольно просто.

alist = [1,[1,2],[1,2,[4,5,6],3, "33"]]
newlist = []

while len(alist) > 0 :
  templist = alist.pop()
  if type(templist) == type(list()) :
    while len(templist) > 0 :
      temp = templist.pop()
      if type(temp) == type(list()) :
        for x in temp :
          templist.append(x)
      else :
        newlist.append(temp)
  else :
    newlist.append(templist)
print(list(reversed(newlist)))
12
задан Patryk 24 April 2012 в 17:20
поделиться

8 ответов

Ваш вложенный класс (который не является подклассом, кстати) не помечен как статический, поэтому он является внутренним классом, который требует экземпляра класс кодирования (JavaApp1) для его создания.

Опции:

  • Сделать вложенный класс static
  • Сделать это не внутренним классом ( т.е. не внутри JavaApp1 вообще)
  • Создайте экземпляр JavaApp1 как «охватывающий экземпляр»:
    GenTest x = new JavaApp1().new GenTest();
    

Лично я бы пошел с второй подход - вложенные классы в Java имеют несколько странностей вокруг них, поэтому я бы использовал классы верхнего уровня, если у вас нет веских причин сделать его вложенным. (Окончательный вариант особенно беспорядочен, IMO.)

Дополнительную информацию о внутренних классах см. В разделе 8.1.0 JLS .

17
ответ дан Jon Skeet 25 August 2018 в 17:03
поделиться
class Test {

    static class GenTest { // nested class with static

        static void oldFunction() { // static method
            System.out.println("don't use that");
        }
        void newFunction() { // non-static method
            System.out.println("That's ok.");
        }
    }

    public static void main (String[] args) {
        GenTest.oldFunction(); // call static method

        GenTest two = new GenTest(); // call non-static method
        two.newFunction();
    }

}

Java Online java

0
ответ дан antelove 25 August 2018 в 17:03
поделиться

Пожалуйста, используйте

static class GenTest()......
1
ответ дан danny.lesnik 25 August 2018 в 17:03
поделиться

Класс GenTest является нестатическим классом и поэтому должен быть создан в экземпляре JavaApp1. Если вы выполняете static class GenTest то, что у вас есть, иначе вам нужно создать экземпляр JavaApp1 и создать GenTest в нестационарном методе.

1
ответ дан John B 25 August 2018 в 17:03
поделиться

Класс вложен, что означает, что ваш вложенный класс не является статичным, что означает, что вы должны создать объект для вложенного класса через объект основного класса. что это означает, что ваш psvm должен быть таким.

public static void main(String[] args) {
    JavaApp1 a=new JavaApp1(); //create an object for the main class
    JavaApp1.GenTest x=a.new GenTest();

    x.oldFunction();
    x.newFunction();
}
0
ответ дан Jose Bert Francis 25 August 2018 в 17:03
поделиться

Он должен быть static class GenTest, поскольку вы создаете его экземпляр из статического метода.

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

2
ответ дан MByD 25 August 2018 в 17:03
поделиться

Thar, потому что GenTest определяется с учетом контекста JavaApp1. Поэтому вы можете ссылаться на него, если у вас нет экземпляра JavaApp1. Измените его на static class, чтобы он работал.

static class GenTest...

1
ответ дан mprivat 25 August 2018 в 17:03
поделиться

Способ, которым вы вызываете, не является правильным способом сделать это. Поскольку внутренний класс GenTest является членом JavaApp1, правильным способом его вызова будет

GenTest x = new JavaApp1().new GenTest();

. Используя его, ваш класс будет правильно компилироваться.

0
ответ дан Patryk 25 August 2018 в 17:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: