以下作品:
trait Context[T] {
def context(x: T): String
class Foo[T : Context](x: T) {
def bar() = implicitly[Context[T]].context(x)
}
implicit val c = new Context[Double] {
override def context(x: Double): String = "I am a double"
}
val f = new Foo(2.0)
f.bar() // I am a double
所以我想......如果我构建一个在其中有自己的Context定义的类也可以吗?
object Foo {
def apply[T : Context](x: T) = new Foo[T](x)
def apply[T](x: T, contextFunc: T => String): Foo[T] with Context[T] = new Foo[T](x) with Context[T] {
override def context(x: T): Double = contextFunc(x)
}
}
val f2 = Foo[Double](2.0, x => "I am still a double")
但它开始抱怨第二个应用函数中缺少隐含证据。我可以想象,因为看起来它开始首先使Foo类,然后开始制作Context [T]特征。
有没有办法解决这个问题?换一种说法?有没有办法构造一个有自己的Context [T]的Foo类?
答案 0 :(得分:2)
最简单的方法可能是在构造Foo
时构造一个上下文对象并明确地将其作为参数传递:
def apply[T](x: T, contextFunc: T => String): Foo[T] =
new Foo(x)(new Context[T] {
def context(t: T) = contextFunc(t)
})