Как отличить объекты с разными полями абстрактного типа?
Предположим, у нас есть абстрактный класс с полем абстрактного типа:
abstract class A {type T}
Теперь предположим, что у нас есть метод, который возвращает объекты типаA
, но поле типа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
gt;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
Кажется, тип поля типа будет удален стиранием (side question: Потому что поля типов переводятся в типы параметров в Java?)
Поэтому это не сработает
scala> Test.tryToDistinguish(new A {type T = Int})
String type
Alternative : Мы можем альтернативно создать перечисление и поставить дополнительное поле в классеA
чтобы различать объекты. Но это пахнет, потому что это будет означать, что мы повторно внедряем систему типов.
Question : Есть ли способ различать типы объектов с помощью поля типа? А если нет, что будет хорошим обходным путем?