从2.9升级到scala 2.11:类型参数Any不符合类型参数范围T <:可比

时间:2020-07-03 19:29:51

标签: scala

我理解错误消息的意思,但是不确定我到底需要在哪里添加某种类型的边界。

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)
}

1 个答案:

答案 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]