我已经定义了一个带有无形支持方法的隐式类,以便通过它的类型在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
?