抽象型フィールドを持つ抽象クラスがあるとします。
abstract class A {type T}
ここで、 type のオブジェクトを返すメソッドがあるとしますA
が、 type フィールドT
は異なる場合があります。これらのオブジェクトをどのように区別できますか?
パターンマッチを試すことができます:
object Test {
def tryToDistinguish(a: A) =
a match {
case b: A {type T = String} => println("String type")
case b: A {type T = Int} => println("Int type")
case b: A => println("Other type")
}
}
しかし、コンパイラは文句を言うでしょう:
$>scalac -unchecked Test.scala
Test.scala:8: warning: refinement example.test.A{type T = String} in type patter
n example.test.A{type T = String} is unchecked since it is eliminated by erasure
case b: A {type T = String} => println("String type")
^
Test.scala:9: warning: refinement example.test.A{type T = Int} in type pattern e
xample.test.A{type T = Int} is unchecked since it is eliminated by erasure
case b: A {type T = Int} => println("Int type")
^
two warnings found
型フィールドの型は消去によって削除されるようです (副次的な質問: Java では型フィールドがパラメーター型に変換されるためですか?)
したがって、これは機能しません。
scala> Test.tryToDistinguish(new A {type T = Int})
String type
代替 :A
オブジェクトを区別するために、代わりに列挙を作成し、クラスに追加のフィールドを配置することができます。しかし、これは、型システムを再実装することを意味するため、においがします。
質問:タイプ フィールドを使用してオブジェクトのタイプを区別する方法はありますか? そうでない場合、良い回避策は何ですか?