6

假设我有代码:

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 使用s2in 中的值Y吗?(如果我重命名s2s1,它会按预期工作,但这不是我想要的)。

另一个解决方案是不做import X._,这也是我试图避免的事情。

4

3 回答 3

10

您可以做的另一件事是导入除s1:之外的所有内容import X.{s1 => _, _}

于 2015-02-28T14:59:06.747 回答
8

我同意另一个答案,即在这些类型的情况下明确提供隐式是首选,但如果您坚持要“降级”另一个隐式,因此它不再被视为隐式,那么实际上是可能的:

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
}

同样,这有点骇人听闻,但它确实有效。

于 2015-02-28T12:55:55.650 回答
3

尝试:

new A()(s2)

这应该通过 er 显式提供它来覆盖隐式参数。

于 2015-02-28T09:30:27.287 回答