隐式子类型类解析

时间:2018-04-17 17:05:32

标签: scala shapeless

我已经定义了一个带有无形支持方法的隐式类,以便通过它的类型在Seq中查找元素:

implicit class FindByType[L]( l: Seq[L] ) {
  def findByType[A](
    implicit
    typeable: Typeable[A]
  ): Option[A] = l.flatMap( _.cast[A] ).headOption
}

我想在一个类中实现这个功能。我知道可以通过以下方式完成:

sealed trait A
class A1 extends A

class D(l:Seq[A]) {
  def get[B <: A](implicit typeable: Typeable[B]) = {
    l.findByType[B]
  }
}

这有点烦人,因为我最终需要将Typeable隐式传递给所有未使用具体B调用的调用站点。例如,我无法执行以下操作:

trait C {
  type T <: A
}

class C1 extends C {
  type T = A1
}

val cs:List[C] = List(new C1)

val d = new D(Seq(new A1()))

cs.exists{ c => d.get[c.T].isDefined}

我想知道是否可以做类似的事情:

class D(l:Seq[A]) {
  implicit def typeableForAnyA[F <: A]:Typeable[F] = ???

  def get[F <: A] = {
    l.findByType[F]
  }
}

我说,对于A的每个子类型[某些F],都有一个编译时保证,有一个可用的Typeable[F]。但是,我不确定如何在没有像typeableForAnyA这样只是运行时检查的情况下实现ClassTag。有没有人知道如何实现typeableForAnyA进行编译检查并保存我需要Typeable的隐式get

0 个答案:

没有答案