我有来自两个第三方库的特征,我正试图将它们融入我自己的特征中。他们都定义了implicit val
s named log
。
但是,它们有不同的类型——一种是 SLF4J Logger
,另一种是 Spray LoggingContext
(实际上是 Akka LoggingAdapter
)。事实上,第二个特征来自 Spray,它是一个HttpServer
. (不是你可以在 Github 上找到的最新版本,它不再有val
)。
所以,这里是代码(库一重命名,因为它是专有的,喷雾代码被剪断以显示相关部分):
object LibraryOneShim {
trait LibraryOne {
implicit val log: org.slf4j.Logger = ...
}
}
// https://github.com/spray/spray/blob/a996a5b6bdd830e613583fed86e87bf049fdb8c0/spray-routing/src/main/scala/spray/routing/HttpService.scala
trait HttpService extends Directives {
val log = LoggingContext.fromActorRefFactory // this is a LoggingContext/LoggingAdapter
}
trait MyTrait extends HttpService with LibraryOne {
val myRoute = ...
}
class MyActor extends Actor with MyTrait {
def receive = runRoute(myRoute)
}
这不会编译。编译器抱怨:
错误:使用 spray.util.LoggingContext 覆盖类型为 java.lang.Object 的 trait HttpService 中的惰性值日志;org.slf4j.Logger 类型的特征 LibraryOne$class 中的惰性值日志需要 `override' 修饰符 trait DemoService extends HttpService with LibraryOne {
有什么办法可以将这两个特征混合在一起吗?