类型参数的Scala特征运行时类

三杯

我有一个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所有想要使用此特征的类中添加字段。

ghik

在Scala中解决类型擦除的一种很好的通用方法是使用ClassTags。它们通常作为隐式参数传递。不幸的是,特征不能采用构造函数参数,所以我们可以拥有的最好的方法是:

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*/
}

然后,如果您有一些具体的enum MyEnum,则可以无缝地创建类的实例:

new MyClass[MyEnum](/*your params, if any*/)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scala使用扩展特征的类的反射来访问运行时类型的成员

来自分类Dev

Scala类在运行时检查

来自分类Dev

在Scala的运行时从Object获取类

来自分类Dev

运行时类型的泛型类

来自分类Dev

Scala:滥用特征,导致运行时错误

来自分类常见问题

在Scala中在运行时获取泛型参数的显式类型

来自分类Dev

在Scala中在运行时获取泛型参数的显式类型

来自分类Dev

没有类型参数的Scala中的运行时实例化

来自分类Dev

Scala:如何使函数的返回类型通用并取决于运行时参数?

来自分类Dev

Scala-根据构造函数参数的运行时类型选择构造函数

来自分类Dev

Scala case类仅在运行时复制一些参数?

来自分类Dev

Scala case类仅在运行时复制一些参数?

来自分类Dev

如何获得带有通用参数的Scala运行时类?

来自分类Dev

查找对象的参数化批注的运行时类类型

来自分类Dev

在运行时使用默认构造函数实例化类型参数化的类

来自分类Dev

Scala在运行时获取构造函数参数

来自分类Dev

实例来自运行时Scala的某种类型

来自分类Dev

在Scala中的运行时获取多态类的实例

来自分类Dev

是否可以在运行时获取类型参数?

来自分类Dev

是否可以在运行时获取类型参数?

来自分类Dev

Swift类作为objc运行时的参数

来自分类Dev

Java:在运行时将类作为参数传递

来自分类Dev

在运行时使用“ const”参数构造类

来自分类Dev

运行时13类型不匹配

来自分类Dev

查找与Objc运行时类类型等效的isMemberOf

来自分类Dev

运行时13类型不匹配

来自分类Dev

使用TypeBuilder获取在运行时创建的类的类型

来自分类Dev

在运行时选择类成员的类型

来自分类Dev

在运行时检查生锈特征

Related 相关文章

热门标签

归档