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]
アイデアを共有していただきありがとうございます。幸運をお祈りしています。