我有兩個第三方庫的特徵,我試圖將它們融入到我自己的特質中。它們都定義爲implicit val
,其名稱爲log
。如何混合具有相同名稱但不同類型的隱式vals的特徵?
但是,他們是不同的類型 - 一個是SLF4J Logger
,另一個是噴霧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)
}
這不會編譯。編譯器抱怨:
error: overriding lazy value log in trait HttpService of type java.lang.Object with spray.util.LoggingContext; lazy value log in trait LibraryOne$class of type org.slf4j.Logger needs `override' modifier trait DemoService extends HttpService with LibraryOne {
有沒有什麼辦法可以將這兩種特性混合在一起?
我明白了。是的,這可能會起作用,但是... ick。我很高興這是一個有爭議的問題。這個故事的道德,不要在你的圖書館中使用像「log」這樣的常用名字的vals ... – ryryguy 2013-03-12 16:31:43
如果你這樣做,至少用'def'聲明它們, – EECOLOR 2013-03-12 18:31:51