在伴侣对象导入期间出现“需要稳定的标识符”错误

时间:2011-08-07 00:11:55

标签: scala

我是Scala的新手,我遇到了一个错误,我无法通过自己或互联网搜索解决。

我有一个名为“GUI”的Scala类,它代表一个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 个答案:

答案 0 :(得分:9)

为了补充Kipton的答案,做法没有错:

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

但结果不是构造函数 - 它将是一个普通的方法。

val a = new GUI()不会打印任何内容,但会调用a.GUI()

这就是您没有收到有关错误定义构造函数的错误消息的原因。


当您运行命令import GUI._时,Scala需要GUI始终评估到同一个对象。仅当GUIobjectpackageval时才会出现这种情况。

在您的代码中,import GUI._引用了您定义的方法GUI,因为GUI方法的定义范围比object GUI更接近(事实是编译器没有遇到def GUI的定义,但没有区别。)

由于import GUI._引用的方法GUI不是valobjectpackage,因此您收到了有关{{}的错误消息1}}不是稳定的标识符。

答案 1 :(得分:7)

欢迎来到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);
  ...
}

需要一点点习惯,但我想你会发现Scala的方式更好。

如果要定义辅助构造函数,请声明方法def this(...) { ... },其第一个表达式是对主构造函数的调用(在本例中只是this(),因为它不接受参数)。

如果要向主构造函数添加参数,可以将类定义为

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

然后你可以在这个类体中的任何地方使用参数。