来自类型参数的Scala trait运行时类

标签 scala type-parameter

我有一个 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/

相关文章:

xml - 为什么 XML 文字在 Scala 中产生可变对象?

C# 在运行时获取定义字典的类型

arrays - Scala - 创建指定长度的类型参数化数组

scala - 从构造函数参数值映射创建类实例

scala - Scala 中路径依赖内部类型之间的关系

scala - 以任何对象作为参数的函数

c# - 指定类本身的泛型类的基类约束

scala - Scala在类型类运算符中缺少参数类型

scala - ConcurrentHashMap[String, AtomicInteger] 或 ConcurrentHashMap[String, Int] 用于线程安全计数器?

scala - Slick - 一对多表模式