使用“方法xxx覆盖任何内容”错误覆盖Scala中的通用函数

时间:2017-07-10 14:49:06

标签: scala generic-programming covariant

我正在学习Scala语言功能。我声明了一个带有类型参数的类。

class Pair[+T](val first: T, val second: T){
  // T is a covariant type. So an invariance R is introduced.
  def replaceFirst[R >: T](newFirst: R) = {
    new Pair(newFirst, second)
  }

  override def toString = "(" + first + ", " + second + ")"
}

班级Pair有一个通用函数replaceFirst。我声明了一个新的NastyDoublePair类,它扩展了Pair[Double]。我想覆盖泛型函数replaceFirst。这是编译错误代码:

class NastyDoublePair(first: Double, second: Double) extends Pair[Double](first, second){
  override def replaceFirst(newFirst: Double): Pair[Double] = {
    new Pair[Double](newFirst, second)
  }
}

编译错误低于

Ch17.scala:143: error: method replaceFirst overrides nothing.
Note: the super classes of class NastyDoublePair contain the following, non final members named replaceFirst:
def replaceFirst[R >: Double](newFirst: R): ch17.p9.Pair[R]
            override def replaceFirst(newFirst: Double): Pair[Double] = {
                                     ^

但是,如果我将函数replaceFirst更改为

def replaceFirst(newFirst: T) = {
  new Pair(newFirst, second)
}

此外,将Pair[+T]更改为Pair[T]。一切顺利。

即使我想将类型参数T设置为协变类型,如何修复编译错误。否则,我的案子没有办法解决。我必须使用不变的类型参数,而不是Pair[+T],而是Pair[T]

感谢您分享您的想法。祝福。

1 个答案:

答案 0 :(得分:2)

这是因为类型参数在NastyDoublePair中发生了变化,您可以按照以下方式进行编译:

class NastyDoublePair(first: Double, second: Double) extends Pair[Double](first, second){
  override def replaceFirst[R >: Double](newFirst: R) = {
    new Pair(newFirst, second)
  }
}