如何定义任何扩展此特征的东西

Jus*_*s12 4 scala scala-2.8

请参阅以下代码段:

 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)