请参阅以下代码段:
trait Fruit {
val color:String
def == (fruit:Fruit) = this.color == fruit.color
}
case class Orange(color:String) extends Fruit
case class Apple(color:String) extends Fruit
Run Code Online (Sandbox Code Playgroud)
正如所料,Orange("red") == Orange("red")是true.但是,我想强制说只能比较相同类型的水果,所以例如Orange("red") == Apple("red")应该给出错误.我们能否以优雅的方式==在特征的签名中强制执行此操作Fruit?
编辑:我想在编译时捕获错误,而不是在运行时.
Jam*_*Iry 10
Scalaz有一个Equal"类型类"可以解决这个问题,尽管操作员不同.
https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Equal.scala
它的核心基本上是这个(虽然我使用===,他们使用一些unicode)
/** Defines a type safe === operator */
trait Equals[A] {
def ===(y : A) : Boolean
}
/** A conventient way to define Equals traits based on the == operator */
def equalA[A](x : A) = new Equals[A] {
def ===(y : A) = x == y
}
Run Code Online (Sandbox Code Playgroud)
就像这样使用
// one for oranges
implicit val EqualsOrange = equalA[Orange] _
// one for apples
implicit val EqualsApple = equalA[Apple] _
Orange("red") === Orange("red") // true
Orange("red") === Orange("green") // false
Orange("red") === Apple("red") // Compile error
Run Code Online (Sandbox Code Playgroud)