Как отличить объекты с разными полями абстрактного типа?

Предположим, у нас есть абстрактный класс с полем абстрактного типа:

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 : Есть ли способ различать типы объектов с помощью поля типа? А если нет, что будет хорошим обходным путем?

Ответы на вопрос(3)

Ваш ответ на вопрос