我正在学习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]
感谢您分享您的想法。祝福。
答案 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)
}
}