2

我正在尝试隐式获取 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隐式地通过类型变量声明而不显式指定它?

问题是我正在努力使代码尽可能易于客户使用。

4

1 回答 1

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 支持带参数的特征,但它不能很好地与泛型混合。

于 2017-07-07T11:40:10.360 回答