compareTo类型错误

时间:2018-01-29 06:07:15

标签: scala types compareto

我试图制作一个通用函数diff来计算目标向量上的间隙(Array[T]

e.g。

diff(Array(1,3,5)) - >数组(2,2)
diff(数组(日期(2018-01-01),日期(2018-01-03),日期(2018-01-06))) - >数组(2,3)

import java.sql.Date
import java.text.SimpleDateFormat

object Test extends App {

  val toDate: String => Date =
    (x: String) => new SimpleDateFormat("yyyy-MM-dd").parse(x).asInstanceOf[Date]

  val data: Array[Date] = 
    Array("2018-01-01", "2018-01-02", "2018-01-05", "2018-01-10").map(toDate(_))

  def diff[E <: Comparable[_]](xs: Array[E]): Array[Int] =
    if(xs.length < 2) Array(0)
    else xs.tail.zipWithIndex.map { tu =>
      val x2: E = tu._1
      val idx: Int = tu._2
      val x1: E = xs.init(idx)
      x2 compareTo x1
    }

  (data).foreach(println(_))
  diff(data).foreach(println(_))
}

发生这样的错误,

  

错误:(19,20)类型不匹配;
  发现:x1.type(底层类型E)
  必需:_ $ 1 x2 compareTo x1

x2&amp; x1类型为E,类型为Compareable[_]

我不知道如何修复我的代码

1 个答案:

答案 0 :(得分:2)

解决问题的一种方法是使用视图绑定:

object Test extends App {

    val toDate: String => java.sql.Date =
(x: String) => new Date(new SimpleDateFormat("yyyy-MM-dd").parse(x).getTime)

    val data: Array[Date] =
Array("2018-01-01", "2018-01-02", "2018-01-05", "2018-01-10").map(toDate(_))

    def diff[E <% Comparable[_ >: E]](xs: Array[E]): Array[Int] =
    if (xs.length < 2) Array(0)
    else xs.tail.zipWithIndex.map { tu =>
       val x2: E = tu._1
       val idx: Int = tu._2
       val x1: E = xs(idx)
       x2 compareTo x1
    }


   data.foreach(println(_))
   diff(data).foreach(println(_))
}

我从How do I write the equivalent of T extends Comparable?学习。

顺便说一句,compareTo不会返回两个元素之间的差异。它只返回-1,0和1。