如何调用“def imperativeBubbleSort [T<%Ordered [T]](source:Array [T]):Array [T] = {”

时间:2014-06-26 22:41:29

标签: scala

方法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的子类?

1 个答案:

答案 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序列对象而不是数组传递。