添加默认包导入

时间:2011-02-17 07:44:14

标签: java scala jvm-languages

在Java,Scala或通常任何JVM语言中,默认情况下会导入一组包。例如,Java会自动导入java.lang,您无需在Java代码文件中执行此操作。

现在我不知道哪个组件完全处理这个问题(编译器?JVM?),但有没有办法让其他软件包甚至默认导入类?

假设你有一个包定义了你在整个项目中使用的一组实用函数(一个例子可能是Scala中的scala.math),如果你能够在每个数学中跳过导入它会很棒相关课程。

4 个答案:

答案 0 :(得分:12)

Scala,从2.8开始,有包对象,其内容会自动导入到包的每个文件中。在包的顶级目录中创建一个名为package.scala的文件(例如x/y/z/mypackage),并将其放入其中

package x.y.z

package object mypackage {
  ...
}

然后,包对象中的任何定义都会被自动导入(即,不需要import语句)到包x.y.z.mypackage中的任何文件中

您可以查看Scala源代码 - 执行find dir -name package.scala - 其中有一大堆,最顶层的是定义scala包本身的隐式导入,它们会自动导入到每个scala源文件。

答案 1 :(得分:11)

Jim Balterhis answer中提及(继续投票)Scala 2.8 package object

  

任何可以放在类中的定义,也可以放在包的顶层。如果您有一些帮助方法,您希望在整个软件包的范围内,请继续将其放在软件包的顶层。

     

为此,请将定义放在包对象中。每个包都允许有一个包对象

Scala实际上有自己的scala package object 请参阅“Where to put package objects”。

因此,package对象可以解决给定包的显式导入问题,但不能解决任何包的问题 它的current limitations include

  
      
  • 首先,您无法在包对象中定义或继承重载方法。
  •   
  • 其次,您无法在包对象中定义或继承成员,该对象也是同一包中的顶级类或对象的名称。
  •   
     

我们预计未来一些Scala版本将放弃这些限制。


原始答案:

在Scala方面,像“should Scala import scala.collection.JavaConversions._ by default?”这样的问题表明您不能只是将默认导入添加为Scala用户。
它必须得到语言的支持。

顺便说一句,结论是:

  

从Scala专家的角度来看:让我们保持简单,并将默认导入的含义限制在绝对最小值。
  Heiko Seeberger


Raphael确实发表评论:

  

我想你可以编写自己的编译器插件来添加一些软件包吗?

果然,这Scala article describe how to extend the Scala compiler 但支持的主要补充是:

  
      
  • 您可以向编译器添加阶段,从而添加额外的检查或在类型检查完成后应用的额外树重写。
  •   
  • 您可以告诉编译器类型检查有关要应用于类型的注释的信息。
  •   

因此即使使用树重写(包括其他导入),我也不确定是否可以及时完成重写,因为可以正确分析类型和函数(由您要求的隐式导入引用)。
但也许Scala Compiler Corner对此有更多的想法。

答案 2 :(得分:4)

java.lang

中指定了{{1}}所有类的默认导入

必须使用import语句导入所有其他类。

答案 3 :(得分:1)

在Java中没有办法做到这一点。