Ошибка «Требуется стабильный идентификатор» при импорте сопутствующего объекта - PullRequest
3 голосов
/ 07 августа 2011

Я действительно новичок в Scala, и я столкнулся с ошибкой, которую не могу решить самостоятельно или с помощью поиска в Интернете.

У меня есть класс Scala под названием "GUI", который представляет JFrame вместе с сопутствующим классом. Когда я пытаюсь импортировать сопутствующий класс, используя import GUI._, я получаю ошибку «Требуется стабильный идентификатор, но GUI.this.GUI () найден».

Я создал пустой класс и сопутствующий объект, и импорт работал нормально, поэтому я предполагаю, что ошибка связана с чем-то конкретным для моего кода. Ниже приведен код вопроса:

object GUI {

   def test:Integer = 1
}

class GUI extends JFrame{

import GUI._
val ICON_LOCATION:File = new File("Images/iMovies.ico");
val ICON:BufferedImage = Ootil.createImage("iMovies.png");
val TITLE:String = "iVideos";
val LICENSE_NAME:String = "OpenBSD";

def GUI(){
    setLayout(new BorderLayout());

    createGUI();

    pack();
    setSize(100,100);
    setLocationRelativeTo(null);
    setVisible(true);
}

def versionMajor: Integer = 1
def versionMinor: Integer = 0
def versionRevision: Integer = 0
def versionPreReleaseID: String = "alpha"
def versionBuildNumber: String = "1b"

private def createGUI():Unit = {
        val panel = new JPanel();
        panel.setLayout(new BorderLayout());


        add(panel, BorderLayout.CENTER);
}

def getIcon():BufferedImage = ICON

def getProgramTitle():String = TITLE

def getConfigOptions():LookAndFeelConfigurationOptions = GUIConfigOptions.CONFIG_OPTIONS;
}

Ответы [ 2 ]

9 голосов
/ 07 августа 2011

Чтобы добавить к ответу Киптона, нет ничего плохого в том, чтобы делать:

class GUI{
  def GUI() {
    println("something")
  }
}

Но результат не будет конструктором - это будет обычный метод.

val a = new GUI() ничего не печатает, но вызов a.GUI() будет.

Вот почему вы не получили сообщение об ошибке при неправильном определении вашего конструктора.


Когда вы запускаете команду import GUI._, Scala требуется GUI, чтобы всегда вычислять один и тот же объект. Это только тот случай, когда GUI является object, package или val.

В вашем коде import GUI._ ссылается на метод GUI, который вы определили, потому что метод GUI определен в более близкой области, чем object GUI (тот факт, что компилятор не встретил определение def GUI пока не имеет значения).

Поскольку import GUI._ относится к методу GUI, который не является val, object или package, вы получили сообщение об ошибке о том, что GUI не является стабильным идентификатором.

7 голосов
/ 07 августа 2011

Добро пожаловать в сообщество Scala.

Конструкторы Scala работают иначе, чем в Java. Чтобы исправить ошибку, вы должны поместить тело ранее определенного метода GUI() непосредственно в определение класса, например,

class GUI extends JFrame{
  import GUI._
  val ICON_LOCATION:File = new File("Images/iMovies.ico");
  val ICON:BufferedImage = Ootil.createImage("iMovies.png");
  val TITLE:String = "iVideos";
  val LICENSE_NAME:String = "OpenBSD";

  // ** stuff that used to be in method GUI() goes below **
  setLayout(new BorderLayout());
  createGUI();
  pack();
  setSize(100,100);
  setLocationRelativeTo(null);
  setVisible(true);
  ...
}

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

Если вы хотите определить вспомогательный конструктор, объявите метод def this(...) { ... }, первое выражение которого является вызовом основного конструктора (в данном случае просто this(), поскольку он не принимает параметры).

Если вы хотите добавить параметры в ваш основной конструктор, вы должны определить класс как

class GUI( << some parameters >> ) extends JFrame { ... }

и затем вы можете использовать параметры в любом месте тела этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...