2011-02-17 84 views
7

在Java,Scala或通常任何JVM语言中,都有一组默认导入的包。例如,Java会自动导入java.lang,您不需要在Java代码文件中执行此操作。添加默认包导入

现在我不知道哪个组件正好关心这个问题(编译器?JVM?),但是有什么方法可以让其他包甚至默认导入类?

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

+0

“如果您能够跳过导入,这将非常棒”。为什么?现代IDE具有自动完成功能,并根据需要添加导入功能。此外,进口主要是为其他程序员记录代码。如果缺少进口,程序员应该怎么知道它使用了第三个附加类? – 2011-02-17 07:54:26

+1

在我看来,你的后一点应该是项目作者的决定。你可以写关于这个问题的书籍,所以我想把它放在一边。 关于第一点,真的,任何现代Java IDE都可以自动解析类名并添加导入。所以这可能只是一个与Scala相关的问题。在Scala(2.8)中,您可以拥有“包对象”,可以在包范围上定义字段和方法。通过导入包(使用通配符),可以使这些定义可见,就好像它们是在正在使用的类中定义的一样。目前没有IDE支持我所知道的。 – pdinklag 2011-02-17 08:10:35

+0

@AndrewThompson,对我眼睛的锅盖阻碍=效率低下。 – Pacerier 2017-07-29 23:21:25

回答

12

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

package x.y.z 

package object mypackage { 
    ... 
} 

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

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

1

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

+2

+1 ...(和谢天谢地没有!) – 2011-02-17 07:48:36

11

Jim Balter提到了his answer(去给予好评吧)斯卡拉2.8 package object

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

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

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

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

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

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


原来的答复:

在斯卡拉的一面,这样的问题“should Scala import scala.collection.JavaConversions._ by default?”表明,你不能只是添加默认进口的Scala的用户。
它必须得到语言的支持。

顺便说一句,得到的结论是:

从斯卡拉专家观点:让我们让事情变得简单,限制了默认情况下导入到绝对最低的implicits。
Heiko Seeberger


Raphael做评论,但:

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

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

  • 可以相添加到编译器,从而增加了类型检查结束后申请额外的检查或额外的树重写。
  • 您可以告诉编译器类型检查信息有关打算应用于类型的注释。

因此,即使一棵树重写(包括额外的进口),我不知道所说的重写会在短时间内完成的类型和函数(由你所要求的隐含的进口参考)能够正确分析。
但也许Scala Compiler Corner有更多的想法。从java.lang所有类的