我有一个 scala 特性 [这个特性不能编译]
trait MyTrait[T <: Enum] {
def myMethod(name: String): T = {
MyJavaClass.staticMethod(name, classOf[T])
}
}
和一个 Java 类
public class MyJavaClass {
public static <T extends Enum> T staticMethod(String name, Class<T> c) {
return (T) T.valueOf(c, name);
}
}
如何使特征有效 scala?我目前正在做的是添加一个
Class[T]
像这样的领域trait MyTrait[T <: Enum] {
val t: Class[T]
def myMethod(name: String): T = {
MyJavaClass.staticMethod(name, t)
}
}
但我不喜欢添加
t
字段到要使用此特征的所有类。
最佳答案
在 Scala 中解决类型删除的好方法是使用 ClassTag
s。
它们通常作为隐式参数传递。不幸的是,traits 不能接受构造函数参数,所以我们可以拥有的最好的是:
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]])
}
}
然后,每个类扩展
MyTrait
必须像这样定义: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*/)
关于来自类型参数的Scala trait运行时类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21764593/