我是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)
为了补充Kipton的答案,做的事情没有错:
class GUI{
def GUI() {
println("something")
}
}
Run Code Online (Sandbox Code Playgroud)
但结果将不是构造函数 - 它将是一个普通的方法.
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
不是a val
,object
或者package
,你得到的错误信息GUI
不是稳定的标识符.
欢迎来到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)
然后你可以在这个类体中的任何地方使用这些参数.