伴随对象

时间:2016-04-29 01:33:46

标签: scala implicit companion-object

trait Eq[-A] {
  def eq(a: A, b: A): Boolean
}
object Eq {
  implicit object IntEq extends Eq[Int] {
    def eq(a: Int, b: Int) = a == b
  }
}

trait Supertrait[+A]
object Supertrait {
  implicit def Eq[A: Eq]: Eq[Supertrait[A]] = ???
}

trait Subtrait[+A] extends Supertrait[A]
object Subtrait {
  implicit def Eq[A: Eq]: Eq[Subtrait[A]] = ???
}

def f[A](x: Subtrait[A])(implicit ev: Eq[Subtrait[A]]) = ???

f(new Subtrait[Int] {})

编译此代码时,会发生以下错误:

Error:(32, 4) ambiguous implicit values:
 both method Eq in object Supertrait of type [A](implicit evidence$1: Eq[A])Eq[Supertrait[A]]
 and method Eq in object Subtrait of type [A](implicit evidence$2: Eq[A])Eq[Subtrait[A]]
match expected type Eq[Subtrait[Int]]
  f(new Subtrait[Int] {})
   ^

为什么implicit def随播广告系列中Subtrait的优先级高于Supertrait中的implicit def优先级?

我希望子版本的伴随对象中的LowPriorityImplicits优先级高于超级特征中的var switcharoo = function(whateverObject){ for (var i in whateverObject){ if (whateverObject.hasOwnProperty(i)){ alert(i + "redacted" + whateverObject[i]); } } return whateverObject; };

更新

alert(i + "this is a string" + whateverObject[i]); 技巧也不起作用。请参阅Enforcing precedence in implicit instances in Scala

1 个答案:

答案 0 :(得分:0)

您的代码似乎违反了非歧义规则的含义。

来自 Scala编程,第1版:

  

非歧义规则:仅在存在时插入隐式转换   没有其他可能的插入转换。如果编译器有两个   修复x + y的选项,比如使用convert1(x)+ y或convert2(x)   + y,然后它将报告错误并拒绝在它们之间进行选择。可以定义某种最佳匹配"规则   喜欢某些转换而不是其他转换。但是,这样的选择导致了   真的很模糊的代码。想象一下编译器选择convert2,但是你   是文件的新手,只知道convert1 - 你可以花一个   很多时候都在考虑采用不同的转换方式!

可以找到完整的文字here