包对象

Scala 提供包对象作为在整个包中方便的共享使用的容器。

包对象中可以定义任何内容,而不仅仅是变量和方法。 例如,包对象经常用于保存包级作用域的类型别名和隐式转换。 包对象甚至可以继承 Scala 的类和特质。

按照惯例,包对象的代码通常放在名为 package.scala 的源文件中。

每个包都允许有一个包对象。 在包对象中的任何定义都被认为是包自身的成员。

看下例。 假设有一个类 Fruit 和三个 Fruit 对象在包 gardening.fruits 中;

  1. // in file gardening/fruits/Fruit.scala
  2. package gardening.fruits
  3. case class Fruit(name: String, color: String)
  4. object Apple extends Fruit("Apple", "green")
  5. object Plum extends Fruit("Plum", "blue")
  6. object Banana extends Fruit("Banana", "yellow")

现在假设你要将变量 planted 和方法 showFruit 直接放入包 gardening 中。下面是具体做法:

  1. // in file gardening/fruits/package.scala
  2. package gardening
  3. package object fruits {
  4. val planted = List(Apple, Plum, Banana)
  5. def showFruit(fruit: Fruit): Unit = {
  6. println(s"${fruit.name}s are ${fruit.color}")
  7. }
  8. }

作为一个使用范例,下例中的对象 PrintPlanted 用导入类 Fruit 相同的方式来导入 plantedshowFruit,在导入包 gardening.fruits 时使用通配符:

  1. // in file PrintPlanted.scala
  2. import gardening.fruits._
  3. object PrintPlanted {
  4. def main(args: Array[String]): Unit = {
  5. for (fruit <- fruits.planted) {
  6. showFruit(fruit)
  7. }
  8. }
  9. }

包对象与其他对象类似,这意味着你可以使用继承来构建它们。 例如,一个包对象可能会混入多个特质:

  1. package object fruits extends FruitAliases with FruitHelpers {
  2. // helpers and variables follows here
  3. }

注意,方法重载在包对象中不起作用。