添加默认包导入

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

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

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

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

 package xyz package object mypackage { ... } 

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

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

Jim Balter在他的回答中提到了Scala 2.8 包对象

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

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

Scala实际上有自己的scala包对象 。
请参阅“ 放置包对象的位置 ”。

因此,package对象可以解决给定包的显式导入问题,但不能解决任何包的问题。
目前的局限包括 :

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

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


原始答案:

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

顺便说一句,结论是:

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


拉斐尔虽然评论如下:

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

当然,这篇Scala文章描述了如何扩展Scala编译器 。
但支持的主要增加是:

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

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

java.lang中所有类的默认导入在Java语言规范(7.5.5)中指定

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

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