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

斯卡拉隐式排序

发布时间:2020-12-16 09:02:48 所属栏目:安全 来源:网络整理
导读:有没有办法为两个不同的类定义相同的隐式排序? 我尝试沿着以下几行做某事,但它没有检测到排序. abstract class Commoncase class A extends Commoncase class B extends Commonimplicit val KeyOrdering = new Ordering[Common] { override def compare(x:
有没有办法为两个不同的类定义相同的隐式排序?

我尝试沿着以下几行做某事,但它没有检测到排序.

abstract class Common
case class A extends Common
case class B extends Common

implicit val KeyOrdering = new Ordering[Common] {
    override def compare(x: Common,y: Common): Int = {
      x.toString.compareTo(y.toString)
   }
}

解决方法

正如@ntn所指出的,列表的推断类型 – 它的两个元素的最小上限 – 是带有Commonizable的Serializable.由于scala.Ordering在其类型参数上没有逆变,因此隐式解析失败,因为它不符合Ordering [Common]&lt ;: Ordering [Product with Serializable with Common].

您可以通过编写隐式排序来解决此问题,以便始终具有所考虑的隐式参数的确切类型:

abstract class Common
case class A() extends Common
case class B() extends Common

object Common {
  implicit def ordering[A <: Common]: Ordering[A] = new Ordering[A] {
    override def compare(x: A,y: A): Int = {
      x.toString.compareTo(y.toString)
    }
  }
}

或者简洁:

object Common {
  implicit def ordering[A <: Common]: Ordering[A] = Ordering.by(_.toString)
}

(编辑:李大同)

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

    推荐文章
      热点阅读