我正在尝试用2个最简单的类编译程序:
class BaseClass
放在BaseClass.scala和
中class Test extends BaseClass
放在Test.scala中。发出命令scalac Test.scala失败,导致找不到BaseClass。 我不想逐个编译类或使用scalac * .scala。
java中的相同操作:javac Test.java。我哪里错了?
答案 0 :(得分:5)
让我们先看看Java的作用:
dcs@dcs-132-CK-NF79:~/tmp$ ls *.java
BaseClass.java Test.java
dcs@dcs-132-CK-NF79:~/tmp$ ls *.class
ls: cannot access *.class: No such file or directory
dcs@dcs-132-CK-NF79:~/tmp$ javac -cp . Test.java
dcs@dcs-132-CK-NF79:~/tmp$ ls *.class
BaseClass.class Test.class
因此,正如您所看到的,Java 实际上会在您执行此操作时自动编译BaseClass
。这引出了一个问题:它怎么能这样做?它能知道要编译的文件吗?
好吧,当你用Java编写extends BaseClass
时,你实际上知道一些事情。您知道从包名称中找到这些文件的目录。它还知道BaseClass
位于当前文件中,或者位于名为BaseClass.java
的文件中。如果你怀疑这些事实,请尝试从目录移动文件或重命名它,看看Java是否可以编译它。
那么,为什么Scala不能这样做呢?因为它既不假定! Scala的文件可以在任何目录中,无论它们声明的包是什么。实际上,单个Scala文件甚至可以声明多个包,这将使目录规则无法实现。此外,Scala类可以在任何文件中,无论其名称如何。
因此,虽然Java指示文件应该在哪个目录以及文件的调用内容,然后通过让您从javac
的命令行中省略文件名来获得好处,Scala允许您组织代码以任何方式对你来说都是最好的,但要求你告诉代码在哪里。
选择。
答案 1 :(得分:1)
您需要先编译BaseClass.scala
:
$ scalac Test.scala
Test.scala:1: error: not found: type BaseClass
class Test extends BaseClass
^
one error found
$ scalac BaseClass.scala
$ scalac Test.scala
$
编辑那么,现在的问题是为什么你必须逐个编译文件?好吧,因为Scala编译器不执行这种依赖性处理。它的作者可能希望你使用像sbt
或Maven这样的构建工具,这样他们就不必费心了。