1

型制約を使用して、型と型AB同じでなければならないことを示しています。以下では、 from から へ暗黙的にキャストすることが許可されていますが、 from からへAB明示的なキャストが必要です。これを行う正しい方法は何ですか?BA

class Pair[A, B](var first: A, var second: B) {
  def swap()(implicit ev: A =:= B) {
    val tmp = second
    second = first
    first = tmp //won't compile without appending .asInstanceOf[A]
  }

  /*
  ...other methods like replaceFirst, replaceSecond that 
     don't require types A, B to be the same
  */
}
4

1 に答える 1

2

A =:= BAtype が type と等しいことを証明しBます。B次に、型が等しい型であることをコンパイラに伝える必要がありますA。でこれを行いB =:= Aます:)

以下の導入された新しいev2パラメータを参照してください。

class Pair[A, B](var first: A, var second: B) {
  def swap()(implicit ev:  =:=[A,B], ev2:  =:= [B,A])  {
    val tmp = second
    second = first
    first = tmp
}

ところで:「型パラメータを1つだけ使用する」というアドバイスもあります。この方法に従うと、Pairクラス内でそのような制約を必要としない他のメソッド/関数を定義できなくなります。

于 2013-10-20T19:07:41.260 に答える