如何避免在Scala中覆盖包对象?

时间:2016-04-03 22:51:19

标签: scala

假设我有一个包含名为highlevellowlevel的子项目的双子项目构建;子项目highlevel取决于子项目lowlevel。这两个子项目都对包com.example.foo

有贡献

highlevel/src/main/scala/com/example/foo/package.scala

package com.example

package object foo {
  def bar = ???
}

lowlevel/src/main/scala/com/example/foo/package.scala

package com.example

package object foo {
  def wee = ???
}

我遇到的问题是,当我在com.example.foo项目中使用highlevel时,不再定义wee,因为lowlevel' s com.example.foo包裹对象正在黯然失色"通过highlevel的那个。是否有任何方法可以让barwee在子项目highlevel中共存?

(对于有兴趣的人,用例是barwee是隐式转换:bar会处理涉及highlevel中定义的类型的转换,而{ {1}}将处理涉及wee中定义的类型的转换。两个子项目都需要低级类型转换lowlevel。)

1 个答案:

答案 0 :(得分:1)

package objectobject;它不是package。您无法定义两次包对象,原因与以下代码无效的原因相同:

object A
object A

您可以做的是将lowlevel/src/main/scala/com/example/foo/package.scala重命名为lowlevel/src/main/scala/com/example/foo/LowLevel.scala,并将其从package object更改为trait

然后高级包对象可以继承它:

package com.example
package object foo extends com.example.foo.LowLevel

在traits中定义东西是相当常见的,这样包装对象就可以这样组合。 Scalaz做得很广泛。