Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala如何处理Java风格的包语句_Java_Scala_Packages_Scalac - Fatal编程技术网

Scala如何处理Java风格的包语句

Scala如何处理Java风格的包语句,java,scala,packages,scalac,Java,Scala,Packages,Scalac,这听起来很尴尬。我的目的是了解Scala如何处理用Java风格编写的包语句。为此,我编写了一个小示例类(我将其命名为DinnerTimeP.scala,如下所示: package dinnertime class Dinner { val veggie = "broccoli" def announceDinner(veggie: String) { println("Dinner happens to be tasteless " + veggie + " soup")

这听起来很尴尬。我的目的是了解Scala如何处理用Java风格编写的包语句。为此,我编写了一个小示例类(我将其命名为DinnerTimeP.scala,如下所示:

package dinnertime
 class Dinner { 
  val veggie = "broccoli"
   def announceDinner(veggie: String) {
   println("Dinner happens to be tasteless " + veggie + " soup")
  }
 }
我有一个名为scaladev的文件夹,在这个文件夹下我创建了包文件夹dinnertime。在这个包下有DinnerTimeP.scala。在DOS命令下,我导航到dinnertime并用scalac编译文件DinnerTimeP(名称听起来很傻),如下所示

C:\scala-2.9.1.final\scala-2.9.1.final\scaladev\dinnertime>set CLASSPATH=.;C:\scala-  2.9.1.final\scala-2.9.1.final\scaladev

C:\scala-2.9.1.final\scala-2.9.1.final\scaladev\dinnertime>scalac DinnerTimeP.scala
我希望找到在dinnertime文件夹下生成的、位于源文件DinnerTimeP.scala旁边的Dinner.class。 为了确认我的理解,我在同一文件夹下创建了一个HelloWorld.java程序:

package dinnertime;

public class HelloWorld {
  public static void main(String[] args) {
  System.out.println("Hello World");
}
}

我在命令行上编译了HelloWorld.java,如下所示: C:\scala-2.9.1.final\scala-2.9.1.final\scaladev\dintertime>javac HelloWorld.java

HelloWorld.class文件是在其源文件旁边生成的。 这正是我想看到的Scala源文件及其编译文件的情况。 相反,我看到一个由Scala生成的新包文件夹在包文件夹dinnertime中

这可能很幼稚,我可能背叛了对Scala和包的基本理解,但我对这种行为感到困惑。 这是我无法向自己解释的问题:为什么要为新生成的类文件创建嵌套包。这是我希望在自己真诚努力的基础上解决的问题 因为我目前使用Scala的经验有限,所以我求助于询问stackoverflow上的Scala大师,以帮助我了解发生了什么以及为什么?
是否有理由使用Scala而不是Java创建此嵌套包?

首先尝试从根目录编译,以便
晚餐时间
是一个子目录:

$ javac dinnertime/HelloWorld.java
以及:

它们都产生相同的输出,即在这两种情况下
。class
文件放在
晚餐时间
子目录下

当您在包中运行编译器时,会出现这种差异。事实证明,
javac
足够聪明,可以将目标二进制文件相对于根目录而不是当前目录放置。scalac的情况并非如此,它始终使用当前目录作为基础。您可以通过使用
-d
参数轻松解决此问题:

$ cd dinnertime
$ scalac -d .. Dinner.scala
让它工作所需的一切,让我解释一下原因

Scala并不要求源文件位于反映包的目录层次结构中。也就是说,
晚餐。Scala可以在任何地方:这根本不重要

而且,更清楚的是,即使您有一个复杂的包层次结构,很深,并且每个级别都有多个子包,您也可以将所有源文件放在一个目录中。放Scala文件的目录并不相关

很抱歉这么强调它,但是来自Java,可能很难理解这一点

好的,现在,如何解释
晚餐时间/Dinner.class
?好的,JVM要求将类文件放在与包名相对应的目录层次结构中,因此即使Scala源文件可以放在任意目录中,scalac也必须生成一个目录结构反映包名的输出


因此,为了查看所有内容,Scala不关心您在哪个目录中,因此它忽略了您在名为
dinnertime
的目录中这一事实。然而,由于源代码表明该类位于名为
dinnertime
的包中,它创建了这样的目录并将类文件放在其中。它假定了该目录的基础是当前目录,根据Tomasz的回答,可以使用
-d
参数进行更改。

我刚刚运行了scalac-d这是我所做的:C:\scala-2.9.1.final\scala-2.9.1.final\scaladev\dinnertime>scalac-d dinnertime.scala scala错误:dinnertime.scala不存在或不是某个不存在的目录“我所做的似乎不正确。@ilangogurusamy:
-d
需要一些参数:
scalac-d some/dir dintertimep.scala
更新:有效。我对..很好奇,起初我忽略了它并运行了scalac-d,但当我用..尝试它时,它成功了。这太棒了。Daniels和你的答案都非常准确。”我无法接受。因此两者都是正确的。但我无法为两者设置正确的答案。@ilangogurusamy:没问题,很高兴我们能提供帮助!我现在都看到了。这是非常有用的信息。我感谢您的反馈以及您为解释这些内容所付出的辛勤工作。
$ cd dinnertime
$ scalac -d .. Dinner.scala