gpt4 book ai didi

scala - 使用协变泛型实现 Ordered trait

转载 作者:行者123 更新时间:2023-12-04 12:47:01 24 4
gpt4 key购买 nike

有没有办法混合协变泛型的 Ordered 特征?

我有以下代码:

trait Foo[+T  <: Foo[T]] extends Ordered[T] {

def id: Int

override def compare(that : T) : Int = {
this.id compare that.id
}
}

我需要 T 协变并希望也能正常工作。上面的版本给出了“逆变位置错误中的协变类型”。

最佳答案

您不能将 Ordered 与协变类型一起使用,因为它需要泛型类型处于逆变位置。相反,您应该使用伴随对象中定义的隐式 Ordering

trait Foo[+T] {
def id: Int

}

object Foo {
implicit def fooOrdering[A <: Foo[_]]: Ordering[A] = {
new Ordering[A] {
override def compare(x: A, y: A): Int = x.id compare y.id
}
}
}

任何比较对象的合理函数都应该为它正在比较的对象接受一个 Ordering 实例,而且很多都是隐式的。例如

case class F(id: Int) extends Foo[Int]
case class G(id: Int) extends Foo[Int]

List(F(1), F(2), F(5), F(3), G(12)).max // = G(12)

关于scala - 使用协变泛型实现 Ordered trait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44056938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com