我是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;
}
答案 0 :(得分:9)
为了补充Kipton的答案,做法没有错:
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
,因此您收到了有关{{}的错误消息1}}不是稳定的标识符。
答案 1 :(得分:7)
欢迎来到Scala社区。 p>
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 { ... }
然后你可以在这个类体中的任何地方使用参数。