Переопределить общие функции в Scala. Метод xxx ничего не переопределяет Ошибка

Я изучаю возможности языка 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]

Спасибо, что поделились своей идеей. С наилучшими пожеланиями.


person jiexray    schedule 10.07.2017    source источник


Ответы (1)


Это происходит потому, что параметры типа меняются в NastyDoublePair, вы можете сделать эту компиляцию следующим образом:

class NastyDoublePair(first: Double, second: Double) extends Pair[Double](first, second){
  override def replaceFirst[R >: Double](newFirst: R) = {
    new Pair(newFirst, second)
  }
}
person stefanobaghino    schedule 10.07.2017
comment
Это нормально, если OP удовлетворен экземпляром Pair. - person Yuval Itzchakov; 10.07.2017