java.math.BigInteger,可以在 App 的定义以外的包级别导入该类,这样在包作用域内的所有类就都导入 BigInteger 了。
清单 3. 导入的作用域
package com
{
package tedneward
{
package scala
{
// ...
package mathfun
{
object App
{
import java.math.BigInteger
def factorial(arg : BigInteger) : BigInteger =
{
if (arg == BigInteger.ZERO) BigInteger.ONE
else arg multiply (factorial (arg subtract BigInteger.ONE))
}
def main(args : Array[String]) : Unit =
{
if (args.length > 0)
System.out.println("factorial " + args(0) +
" = " + factorial(new BigInteger(args(0))))
else
System.out.println("factorial 0 = 1")
}
}
}
}
}
}
不只如此,Scala 还不区分高层成员和嵌套成员,所以您不仅可以使用 import 将嵌套类型的成员置于词法作用域中,其他任何成员均可;例如,您可以通过导入 java.math.BigInteger 内的所有名称,使对 ZERO 和 ONE 的限定了作用域的引用缩小为清单 4 中的名称引用:
清单 4. 静态导入
package com
{
package tedneward
{
package scala
{
// ...
package mathfun
{
object App
{
import java.math.BigInteger
import BigInteger._
def factorial(arg : BigInteger) : BigInteger =
{
if (arg == ZERO) ONE
else arg multiply (factorial (arg subtract ONE))
}
def main(args : Array[String]) : Unit =
{
if (args.length > 0)
System.out.println("factorial " + args(0) +
" = " + factorial(new BigInteger(args(0))))
else
System.out.println("factorial 0 = 1")
}
}
}
}
}
}
面向Java开发人员的Scala指南 - 包和访问修饰符(3)
时间:2011-01-30 Ted Neward
您可以使用下划线(还记得 Scala 中的通配符吧?)有效地告知 Scala 编译器 BigInteger 内的所有成员都需要置入作用域。由于 BigInteger 已经被先前的导入语句导入到作用域中,因此无需显式地使用包名限定类名。实际上,可以将所有这些都结合到一个语句中,因为 import 可以同时导入多个目标,目标间用逗号隔开(如清单 5 所示):
清单 5. 批量导入
package com
{
package tedneward
{
package scala
{
// ...
package mathfun
{
object App
{
import java.math.BigInteger, BigInteger._
def factorial(arg : BigInteger) : BigInteger =
{
if (arg == ZERO) ONE
else arg multiply (factorial (arg subtract ONE))
}
def main(args : Array[String]) : Unit =
{
if (args.length > 0)
System.out.println("factorial " + args(0) +
" = " + factorial(new BigInteger(args(0))))
else
Sys
|