compareTo类型错误
compareTo type error
我尝试制作一个通用函数 diff
来计算目标向量上的间隙 (Array[T]
)
例如
diff(数组(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(_))
}
出现这样的错误,
Error:(19, 20) type mismatch;
found: x1.type (with underlying type E)
required: _ x2 compareTo x1
因为 x2
和 x1
是 E
类型,属于 Compareable[_]
我不知道如何修复我的代码
解决您的问题的一种方法是使用视图绑定:
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 不会 return 两个元素之间的差异。它只有 returns -1、0 和 1。
我尝试制作一个通用函数 diff
来计算目标向量上的间隙 (Array[T]
)
例如
diff(数组(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(_))
}
出现这样的错误,
Error:(19, 20) type mismatch;
found: x1.type (with underlying type E)
required: _ x2 compareTo x1
因为 x2
和 x1
是 E
类型,属于 Compareable[_]
我不知道如何修复我的代码
解决您的问题的一种方法是使用视图绑定:
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 不会 return 两个元素之间的差异。它只有 returns -1、0 和 1。