方法imperativeBubbleSort有签名:
def imperativeBubbleSort[T <% Ordered[T]](source: Array[T]): Array[T] = {
for (i <- 0 until source.length - 1; j <- 0 until source.length - 1 - i) {
if (source(j) > source(j + 1)) {
val temp = source(j)
source(j) = source(j + 1)
source(j + 1) = temp
}
}
source
}
要调用它我使用:
imperativeBubbleSort(3,2,1)
但收到错误:
Multiple markers at this line - too many arguments for method imperativeBubbleSort: (source: Array[T])(implicit
evidence$1: T => Ordered[T])Array[T] - too many arguments for method imperativeBubbleSort: (source:
Array[T])(implicit evidence$1: T => Ordered[T])Array[T]
但是这个函数只需要一个参数吗?
[T <% Ordered[T]]
是否意味着我需要添加一个类型参数,它是Ordered的子类?
答案 0 :(得分:0)
看起来你真的想要一个varargs方法。使用Array[T]
来指定vararg类型,而不是T*
。这是一个更新版本:
def imperativeBubbleSort[T <% Ordered[T] : ClassTag](inputs: T*): Array[T] = {
val source = inputs.toArray
for (i <- 0 until source.length - 1; j <- 0 until source.length - 1 - i) {
if (source(j) > source(j + 1)) {
val temp = source(j)
source(j) = source(j + 1)
source(j + 1) = temp
}
}
source
}
请注意,我必须在ClassTag
类型上添加T
限制。这是因为toArray
中的Seq
方法需要它才能创建新数组。这是因为在Scala中,varargs作为Scala序列对象而不是数组传递。