添加默认包导入
在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中,没有办法做到这一点。
- 将hex字符串解析为int值时出现意外的NumberFormatException
- Gradle无法检测osdetector插件
- 发送Object类型的对象而不是String – Polymorphism
- 与Garbage Collector和finalize()方法相关的问题
- Java 8 Streams:为什么Collectors.toMap对于带有通配符的generics有不同的行为?
- 从java中的文件中读取数据
- java.lang.ClassFormatError:在类文件javax / mail / MessagingException中非本机或抽象的方法中的Absent Code属性
- org.eclipse.swt.SWTException:从表刷新中“处理小部件”
- 如何使用特定的字符编码读取Java文件?