容器的Scalatest隐式相等

容器的Scalatest隐式相等,scala,scalatest,Scala,Scalatest,我们定义了一个自定义的相等[String]: implicit val upperCaseEquality = new Equality[String] { override def areEqual(self: String, b: Any): Boolean = b match { case other: String => self.toUpperCase == other.toUpperCase case _ => false } } 以下代码正常工

我们定义了一个自定义的
相等[String]

implicit val upperCaseEquality = new Equality[String] {
  override def areEqual(self: String, b: Any): Boolean = b match {
    case other: String => self.toUpperCase == other.toUpperCase
    case _ => false
  }
}
以下代码正常工作:

Seq("a").view should contain theSameElementsInOrderAs Seq("A")
现在,我们为
Seq
添加了一个自定义的
Equality

implicit def SeqEquality[T, SEQ[e] <: GenSeq[e]](implicit equality: Equality[T]): Equality[SEQ[T]] = new Equality[SEQ[T]] {
  override def areEqual(self: SEQ[T], b: Any): Boolean = b match {
    case other: GenSeq[_] => self.size == other.size && self.zip(other).forall(equality.areEqual _ tupled)
    case _ => false
    }
}
assert(Seq("a") === Seq("A"))
但不适用于
SeqView

assert(Seq("a").view === Seq("A"))

Exception in thread "main" org.scalatest.exceptions.TestFailedException: SeqView("a") did not equal List("A")
为什么?

如果您看到:

您可以看到,
SeqView[\u,\u]
实际上有两个类型参数,因此它不符合您的规范
SEQ[e]
def view(from: Int, until: Int): SeqView[A, Seq[A]]
implicit def SeqViewEquality[T](implicit equality: Equality[T]): Equality[SeqView[T, Seq[T]]] = new Equality[SeqView[T, Seq[T]]] {
  override def areEqual(self: SeqView[T, Seq[T]], b: Any): Boolean = b match {
    case other: GenSeq[_] => self.size == other.size && self.zip(other).forall(equality.areEqual _ tupled)
    case _ => false
  }
}