gpt4 book ai didi

generics - 初学者 : How do I say "any superclass of generic A"

转载 作者:行者123 更新时间:2023-12-04 17:55:57 28 4
gpt4 key购买 nike

我正在玩 Scala By Example 开头的 QuickSort 示例并尝试将其调整为通用类型 A ,而不仅仅是 Int s。

到目前为止我的工作是

def sort[A <: Ordered[A]](xs: Array[A]) 

这允许 sort在所有反射排序的类型上运行,如 RichBoolean .

但我还想允许类型 A它们延伸的地方 Ordered[B]其中 B 是 A 的父类(super class)(例如,任何扩展 Ordered[Any] 的东西)。

我怎么能说这个?

多亏了 agilesteel's answer,我才真正开始工作:
case class X( i : Int ) extends Ordered[X] {
def compare( x : X ) = x.i - i
}

class Y( i : Int, j : Int ) extends X(i)

case class Z( i : Int ) extends Ordered[Any] {
def compare( a : Any ) : Int = {
if (! a.isInstanceOf[Z] )
sys.error("whoops")

val z = a.asInstanceOf[Z]
z.i - i
}
}

object QuickSort {
def main( args : Array[String] ) {
val xs = Array( 3, 1, 2, 4 ) map X
sort( xs );
val ys = Array( 3, 1, 2, 4 ) map { i => new Y(i, -i) }
sort[X,Y]( ys );
val zs = Array( 3, 1, 2, 4 ) map Z
sort[Any,Z]( zs );
}
def sort[B >: A, A <: Ordered[B]](xs: Array[A]) {
def swap(i: Int, j: Int) {
val t = xs(i); xs(i) = xs(j); xs(j) = t;
}
def sort1(l: Int, r: Int) {
val pivot = xs((l + r) / 2)
var i = 1; var j = r
while (i <= j) {
while (xs(i) < pivot) i += 1
while (xs(j) > pivot) j -= 1
if (i <= j) {
swap(i, j)
i += 1
j += 1
}
}
if (l < j) sort1(l, j)
if (j < r) sort1(i, r)
}
sort1(0, xs.length - 1)
}
}

我被误导了试图使用 RichLongRichBoolean作为测试类型,因为它们实际上并不是反射性的 Ordered (它们改为 Ordered[Long]Ordered[Boolean])。

最佳答案

像这样的东西?

def sort[B >: A, A <: Ordered[B]](xs: Array[B]) 

关于generics - 初学者 : How do I say "any superclass of generic A",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8945892/

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