Scala隐式排序

Scala隐式排序,scala,implicit,Scala,Implicit,我有没有办法为两个不同的类定义相同的隐式排序 我试着按照下面的思路做一些事情,但它没有检测到排序 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

我有没有办法为两个不同的类定义相同的隐式排序

我试着按照下面的思路做一些事情,但它没有检测到排序

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)
   }
}

如果删除A和B的case类(甚至只删除其中一个),那么它就可以工作。 对于排序为的
列表(A(),B())。它找不到可与C序列化的
产品的
排序
,因为A和B的基类是与C的产品(因为A和B都是case类)

如果您要创建一个包含两种不同基本类型元素的列表,我假设您需要一个类型为
list[C]
的列表,您可以在使用它们之前在其中声明元素(或者从返回类型
C
的某个函数获取它们)

val a: C = A()
val b: C = B()
List(a,b).sorted

正如@ntn所指出的,列表的推断类型(它的两个元素的最小上界)是
可与Common
序列化的乘积。作为
scala。排序
在其类型参数上不是逆变的,隐式解析失败,因为它不持有
排序[Common]
extends
是一个保留关键字,而不是一种类型。你是说
Common
?是的,这就是我的意思。谢谢你指出这一点。是的,我也不知道为什么这不起作用。
List(a(),B()).sorted
说找不到隐式排序,但显式
List(a(),B()).sorted(keystering)
有效。我从你的另一个答案中看出你是专家。说到这一点,我更新了这个答案,并说明了这个具体问题。
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)
}