隐式获取ClassTag用于抽象类型

时间:2017-07-07 10:39:06

标签: scala classtag

我试图隐含地获取ClassTag。我有以下特点:

trait Tst{ self =>
  type T
  def getCls = getCls0[T] //no classtag
  private def getCls0[T](implicit ev: ClassTag[T]) = ev.runtimeClass.asInstanceOf[Class[T]]
}

class Tsss extends Tst {
  override type T = String
}

有没有办法通过类型变量声明隐式获取ClassTag而不明确指定它?

事情是我试图使代码尽可能易于为客户使用。

1 个答案:

答案 0 :(得分:2)

我建议你使用抽象类,隐式参数和泛型而不是参数类型:

abstract class Tst[T](implicit ev: ClassTag[T]) { self =>
  def getCls = getCls0[T] //no classtag
  private def getCls0[T](implicit ev: ClassTag[T]) = 
    ev.runtimeClass.asInstanceOf[Class[T]]
}

class Tsss extends Tst[String]

请注意,虽然Dotty支持带参数的特征,但它不会与泛型混合使用。