有没有一种方法可以只用一个抽象方法来简洁地编写匿名子特征?

Is there a way to concisely write anonymous subtrait with only one abstract method?

Scalatest 中编写测试时,我使用了所谓的 Equality[A] 特性,它看起来像(文档省略):

trait Equality[A] extends Equivalence[A] {
  def areEqual(a: A, b: Any): Boolean 
  final def areEquivalent(a: A, b: A): Boolean = areEqual(a, b)
}

我目前实现如下

implicit def positionEquality: Equality[SomeType] = new Equality[SomeType] {
    override def areEqual(a: SomeType, b: Any): Boolean = b match {
        //actual code
    }
}

但我想把它写得更简洁……比如函数字面量之类的。有这样的吗?

UPD:我只能想象一些隐式转换,但它看起来很奇怪,因为每次我想使用它时我都必须明确地将它引入范围。

试试这个:

object Equality {
  def apply[T: ClassTag](fun: (a: T, b: T) => Boolean) = new Equality[T] {
    override def areEqual(a: T, b: Any): Boolean = b match {
      case t: T => fun(a, t)
      case _ => false
    }
  }
}

implicit def positionEquality: Equality[SomeType] = Equality({case (a, b) => ???})

或者走 Eq 路线,让编译器帮助您处理 Any

在 Scala 2.12 中

implicit def positionEquality: Equality[SomeType] = (a, b) => b match ...

should work。在 Scala 2.11 中,它需要 -Xexperimental 编译器选项(IIRC,在某些情况下它无法正常工作;不幸的是,我不知道它们到底是什么,如果这是其中之一,但我不希望如此).