Scala class runtime class from type parameter

I have a scala trait [this trait does not compile]

trait MyTrait[T <: Enum] {
  def myMethod(name: String): T = {
    MyJavaClass.staticMethod(name, classOf[T])
  }
}

And the Java class

public class MyJavaClass {
    public static <T extends Enum> T staticMethod(String name, Class<T> c) {
        return (T) T.valueOf(c, name);
    }
}

How can I make a sign valid scala? What I'm doing now adds a field Class[T]like this

trait MyTrait[T <: Enum] {
  val t: Class[T]

  def myMethod(name: String): T = {
    MyJavaClass.staticMethod(name, t)
  }
}

but I don’t like adding a field tto all classes that want to use this attribute.

+3
source share
1 answer

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*/)
+7

All Articles