Я изучаю возможности языка 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]
Спасибо, что поделились своей идеей. С наилучшими пожеланиями.