0

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にはジェネリック関数がありますreplaceFirstNastyDoublePairを拡張する新しいクラスを宣言します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]

アイデアを共有していただきありがとうございます。幸運をお祈りしています。

4

1 に答える 1