Scalac没有找到依赖类

时间:2011-11-06 15:08:37

标签: scala

我正在尝试用2个最简单的类编译程序:

class BaseClass

放在BaseClass.scala和

class Test extends BaseClass

放在Test.scala中。发出命令scalac Test.scala失败,导致找不到BaseClass。 我不想逐个编译类或使用scalac * .scala。

java中的相同操作:javac Test.java。我哪里错了?

2 个答案:

答案 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编译器不执行这种依赖性处理。它的作者可能希望你使用像sbtMaven这样的构建工具,这样他们就不必费心了。