加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读