6

2つのオブジェクトがあり、それぞれがローカルで定義されたタイプを持っています。タイプが同じかどうかを判断したいと思います。たとえば、次のコードをコンパイルします。

trait Bar {
  type MyType
}

object Bar {
  def compareTypes(left: Bar, right: Bar): Boolean = (left.MyType == right.MyType)
}

ただし、「値MyTypeはBarのメンバーではありません」でコンパイルが失敗します。

どうしたの?これを行う方法はありますか?

4

1 に答える 1

10

これを行うことができますが、少し余分な機械が必要です。

trait Bar {
  type MyType
}

object Bar {
  def compareTypes[L <: Bar, R <: Bar](left: L, right: R)(
    implicit ev: L#MyType =:= R#MyType = null
  ) = ev != null
}

次の場合:

val intBar1 = new Bar { type MyType = Int }
val intBar2 = new Bar { type MyType = Int }
val strBar1 = new Bar { type MyType = String }

期待どおりに動作します:

scala> Bar.compareTypes(intBar1, strBar1)
res0: Boolean = false

scala> Bar.compareTypes(intBar1, intBar2)
res1: Boolean = true

L#MyTypeトリックは、とが同じであるという暗黙の証拠を求め、そうでない場合はR#MyTypeデフォルト値 ( ) を提供することです。null次に、デフォルト値を取得するかどうかを確認できます。

于 2012-10-03T01:42:00.153 に答える