1

在编写测试以验证是否在内部某处选择了正确的类型类时,我遇到了类型擦除。我没有添加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) 方法 bar 不会覆盖任何内容 注意:类 FooStubImpl 的超类包含以下名为 bar 的非最终成员:

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

是否有另一种方法可以在运行时获取不需要的参数化类型的类型信息ClassTag

4

1 回答 1

1

如果您有问题类型的运行时值,只需检查该类型。仅当您没有价值证据时才需要类标签。

class FooStubImpl extends Foo {
  override def bar[T: MyTypeClass](t: T): Unit = {
    val clazz = t.getClass
  }
}
于 2015-05-18T01:39:23.877 回答