これを行うことができますが、少し余分な機械が必要です。
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
次に、デフォルト値を取得するかどうかを確認できます。