在Java,Scala或通常任何JVM语言中,默认情况下会导入一组包。例如,Java会自动导入java.lang
,您无需在Java代码文件中执行此操作。
现在我不知道哪个组件完全处理这个问题(编译器?JVM?),但有没有办法让其他软件包甚至默认导入类?
假设你有一个包定义了你在整个项目中使用的一组实用函数(一个例子可能是Scala中的scala.math
),如果你能够在每个数学中跳过导入它会很棒相关课程。
答案 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 Balter在his 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
必须使用import语句导入所有其他类。
答案 3 :(得分:1)
在Java中没有办法做到这一点。