如果我猜对了CacheParams的定义
trait Parameters
trait CacheParams {
implicit val p: Parameters
}
那么你应该:(1)替换对象
object MetaData /*(implicit val p: Parameters)*/ extends CacheParams
//object creation impossible. Missing implementation for:
// implicit val p: Parameters // inherited from trait CacheParams
有一个类
class MetaData(implicit val p: Parameters) extends CacheParams
或(2)实现对象内部的隐式
object MetaData extends CacheParams {
override implicit val p: Parameters = new Parameters {}
}
或
implicit val params: Parameters = new Parameters {} // suppose an implicit is in current scope
object MetaData extends CacheParams {
override implicit val p: Parameters = {
val p = ??? // hiding above p to avoid ambiguous implicits, null or NPE, see (*) below
implicitly[Parameters]
}
}
(*)NullPointerException on implicit resolution
在 (1) 中,您现在在当前范围内定义/解析隐式。在 (2) 中,您推迟解析隐式直到实例化类(在类构造函数调用站点的范围内解析隐式)。
另见Pass implicit parameter through multiply objects
是的,这将解决我的问题。但我想保持对象的主体干净并与参数中的配置分离,例如接受p: Parameters 的类的主体。
如果在 (1) 中您想将对象与“Parameters 中的配置”分离,您可以尝试引入一个特征 (ParamsMaterializer):
object MetaData extends CacheParams with ParamsMaterializer
trait ParamsMaterializer {
implicit val p: Parameters = new Parameters {}
}
或
implicit val params: Parameters = new Parameters {} // suppose an implicit is in current scope
object MetaData extends CacheParams with ParamsMaterializer
trait ParamsMaterializer {
implicit val p: Parameters = {
val p = ???
implicitly[Parameters]
}
}