假设我有一个包含名为highlevel
和lowlevel
的子项目的双子项目构建;子项目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
的那个。是否有任何方法可以让bar
和wee
在子项目highlevel
中共存?
(对于有兴趣的人,用例是bar
和wee
是隐式转换:bar
会处理涉及highlevel
中定义的类型的转换,而{ {1}}将处理涉及wee
中定义的类型的转换。两个子项目都需要低级类型转换lowlevel
。)
答案 0 :(得分:1)
package object
是object
;它不是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做得很广泛。