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

Bfa*_*ace 3 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;
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*oom 9

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

class GUI{
  def GUI() {
    println("something")
  }
}
Run Code Online (Sandbox Code Playgroud)

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

val a = new GUI()不会打印任何东西,但会打电话a.GUI().

这就是为什么您没有收到有关错误地定义构造函数的错误消息.


运行该命令时import GUI._,Scala需要GUI始终评估相同的对象.这是仅当壳体GUIobject,一个package,或一个val.

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

由于import GUI._引用的方法GUI不是a val,object或者package,你得到的错误信息GUI不是稳定的标识符.


Kip*_*ros 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);
  ...
}
Run Code Online (Sandbox Code Playgroud)

它需要一点点习惯,但我认为你会发现Scala的方式更好.

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

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

class GUI( << some parameters >> ) extends JFrame { ... }
Run Code Online (Sandbox Code Playgroud)

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