私は自分の特性に混ぜようとしている2つのサードパーティライブラリからの特性を持っています。implicit val
どちらも。という名前のを定義しますlog
。
ただし、それらにはさまざまなタイプがあります。1つはSLF4JLogger
で、もう1つはスプレーLoggingContext
(実際にはAkkaLoggingAdapter
です)です。実際、2番目の特性はSprayからのものであり、それはHttpServer
です。(Githubで見つけることができる最新バージョンではありませんが、これはもうありませんval
)。
それで、ここにコードがあります(ライブラリ1は独自仕様であるため名前が変更され、Sprayコードは関連する部分だけを表示するために切り取られました):
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)
}
これはコンパイルされません。コンパイラは文句を言います:
エラー:タイプjava.lang.ObjectのトレイトHttpServiceのレイジー値ログをspray.util.LoggingContextでオーバーライドします。タイプorg.slf4j.LoggerのトレイトLibraryOne$classの遅延値ログインには「オーバーライド」修飾子が必要ですトレイトDemoServiceはLibraryOneでHttpServiceを拡張します{
これらの2つの特性を一緒に混ぜることができる方法はありますか?