scala – 如何定义扩展此特征的任何内容
发布时间:2020-12-16 18:24:00 所属栏目:安全 来源:网络整理
导读:请参阅以下代码段: 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 正如预期的那样,橙色(“红色”)=橙色(“红色”)是
请参阅以下代码段:
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 正如预期的那样,橙色(“红色”)=橙色(“红色”)是真的.但是,我想强制只能比较相同类型的水果,例如橙色(“红色”)== Apple(“红色”)应该给出错误.我们能否以优雅的方式在特质水果的==签名中强制执行此操作? 编辑:我想在编译时捕获错误,而不是在运行时. 解决方法
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 } 就像这样使用 // 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |