我理解错误消息的意思,但是不确定我到底需要在哪里添加某种类型的边界。
Java整数值不从Comparable继承吗?不确定我是否专注于此处的正确区域。
类型参数[Any]不符合方法comp的类型参数 界限[T <:Comparable [T]] [错误] 包容性(java.lang.Integer.valueOf(start), java.lang.Integer.valueOf(finish),succ,comp).map(_。toInt)
def inclusive[T <: Comparable[T]](
start: T,
finish: T,
succ: (T) => T,
comp: (T, T) => Int
): Seq[T] = {
val ret = new ArrayBuffer[T]
var value: T = start
while (comp(value, finish) <= 0) {
ret += value
value = succ(value)
}
ret.toSeq
}
private def comp[T <: Comparable[T]](a: T, b: T) = {
if (a != null)
a.compareTo(b)
else if (b == null) 0
else -1
}
private def compInt(a: Int, b: Int) = {
a - b
}
def inclusive[T <: Comparable[T]](
start: T,
finish: T,
succ: (T) => T
): Seq[T] = {
inclusive(start, finish, succ, comp[T])
}
def inclusive(start: util.Date, finish: util.Date): Seq[util.Date] = {
inclusive(start, finish, succDate, comp[Date])
}
def inclusive(start: String, finish: String): Seq[String] = {
inclusive(start, finish, succString, comp[String])
}
private def succ(x: java.lang.Integer): java.lang.Integer = x + 1
private def comp(
x: java.lang.Integer,
y: java.lang.Integer
): java.lang.Integer = x - y
def inclusive(start: Int, finish: Int): Seq[Int] = {
inclusive(
java.lang.Integer.valueOf(start),
java.lang.Integer.valueOf(finish),
succ,
comp
).map(_.toInt)
}
答案 0 :(得分:3)
这是因为您的comp
参数是一个返回Int
而不是像其他方法一样返回java.lang.Integer
的函数。当添加显式类型参数时,问题变得很明显:
inclusive[java.lang.Integer](
java.lang.Integer.valueOf(start),
java.lang.Integer.valueOf(finish),
succ _,
comp _
)
错误:
overloaded method inclusive with alternatives:
(start: Integer,finish: Integer,succ: Integer => Integer)Seq[Integer]
(start: Integer,finish: Integer,succ: Integer => Integer,comp: (Integer, Integer) => Int)Seq[Integer]
cannot be applied to (Integer, Integer, Integer => Integer, (Integer, Integer) => Integer)
代替返回comp
的{{1}}的版本
Int
它选择具有此签名的comp版本,该版本返回def comp[T <: Comparable[T]](a: T, b: T) //: Int (inferred)
,导致类型不匹配:
java.lang.Integer
您可以通过在对def comp(x: java.lang.Integer, y: java.lang.Integer): java.lang.Integer
的调用中添加类型参数来获取返回comp
的版本来解决此问题:
Int
或将第一个def inclusive(start: Int, finish: Int): Seq[Int] = {
inclusive(
java.lang.Integer.valueOf(start),
java.lang.Integer.valueOf(finish),
succ _,
comp[java.lang.Integer] _
).map(_.toInt)
}
函数的签名更改为此:
inclusive
您也许可以将所有这些变成这样:
def inclusive[T <: Comparable[T]](
start: T,
finish: T,
succ: (T) => T,
comp: (T, T) => java.lang.Integer <- Used to be Int
): Seq[T]