A good and common way to work with erasing styles in Scala is to use ClassTags. Usually they are passed as implicit parameters. Unfortunately, traits cannot accept constructor parameters, so the best we have is:
import scala.reflect.ClassTag
trait MyTrait[T <: Enum] {
val ttag: ClassTag[T]
def myMethod(name: String): T = {
MyJavaClass.staticMethod(name, ttag.runtimeClass.asInstanceOf[Class[T]])
}
}
Then each continuing class MyTraitmust be defined as follows:
class MyClass[T <: Enum](/*your params, if any*/)(implicit val ttag: ClassTag[T]) extends MyTrait[T] {
/*your class body*/
}
, MyEnum, :
new MyClass[MyEnum](/*your params, if any*/)