无法指定ClassTag

时间:2015-05-17 23:11:42

标签: scala scala-reflect

在编写测试以验证在内部的某处选择了正确的类型类时,我遇到了类型擦除。我没有选择将ClassTag添加到签名中,除非我还污染了特征的非测试版本,因为添加: ClassTag会更改方法签名,使其不再是覆盖,例如:

trait Foo {
  def bar[T: MyTypeClass](t: T): Unit
}

class FooStubImpl extends Foo {
  override def bar[T: MyTypeClass: ClassTag](t: T): Unit = {
    val ct = classTag[T]
  }
}

这会导致以下编译错误:

  

错误:(12,20)方法栏会覆盖任何内容       注意:类FooStubImpl的超类包含以下非最终成员名为bar:

override def bar[T](t: T)(implicit evidence$1: MyTypeClass[T]): Unit = {
         ^

是否有其他方法可以获取不需要ClassTag的参数化类型的运行时类型信息?

1 个答案:

答案 0 :(得分:0)

如果您有相关类型的运行时值,只需检查该类型即可。只有在没有价值证据的情况下才需要使用类标签。

class FooStubImpl extends Foo {
  override def bar[T: MyTypeClass](t: T): Unit = {
    val clazz = t.getClass
  }
}