如何覆盖隐式值?
How to override an implicit value?
假设我有代码:
class A(implicit s:String = "foo"){println(s)}
object X {
implicit val s1 = "hello"
}
object Y {
import X._
// do something with X
implicit val s2 = "hi"
val a = new A
}
我收到错误:
<console>:14: error: ambiguous implicit values:
both value s2 in object Y of type => String
and value s1 in object X of type => String
match expected type String
val a = new A
有什么方法可以告诉 Scala 在 Y
中使用值 s2
吗?
(如果我将 s2
重命名为 s1
,它会按预期工作,但这不是我想要的)。
另一个解决方案是不做 import X._
,这也是我试图避免的事情。
尝试:
new A()(s2)
这应该通过明确提供它来覆盖隐式参数。
我同意另一个答案,即在这些类型的情况下明确提供隐式是首选,但如果你坚持要 'downgrade' 另一个隐式所以它不再被视为隐式那么它是实际可能:
class A(implicit s:String = "foo"){println(s)}
object X {
implicit val s1 = "hello"
}
object Y {
import X._
val s1 = X.s1 //downgrade to non-implicit
// do something with X
implicit val s2 = "hi"
val a = new A
}
同样,这有点老套,但它确实有效。
您可以做的另一件事是导入除 s1
之外的所有内容:import X.{s1 => _, _}
.
假设我有代码:
class A(implicit s:String = "foo"){println(s)}
object X {
implicit val s1 = "hello"
}
object Y {
import X._
// do something with X
implicit val s2 = "hi"
val a = new A
}
我收到错误:
<console>:14: error: ambiguous implicit values:
both value s2 in object Y of type => String
and value s1 in object X of type => String
match expected type String
val a = new A
有什么方法可以告诉 Scala 在 Y
中使用值 s2
吗?
(如果我将 s2
重命名为 s1
,它会按预期工作,但这不是我想要的)。
另一个解决方案是不做 import X._
,这也是我试图避免的事情。
尝试:
new A()(s2)
这应该通过明确提供它来覆盖隐式参数。
我同意另一个答案,即在这些类型的情况下明确提供隐式是首选,但如果你坚持要 'downgrade' 另一个隐式所以它不再被视为隐式那么它是实际可能:
class A(implicit s:String = "foo"){println(s)}
object X {
implicit val s1 = "hello"
}
object Y {
import X._
val s1 = X.s1 //downgrade to non-implicit
// do something with X
implicit val s2 = "hi"
val a = new A
}
同样,这有点老套,但它确实有效。
您可以做的另一件事是导入除 s1
之外的所有内容:import X.{s1 => _, _}
.