假设我有两个抽象的,不相关的类型A
和B
(密封的特征,如果有任何不同,没有实现细节)。我希望能够在期望A
s的地方返回B
,反之亦然。
这样:
implicit def aToB(a: A): B = a.asInstanceOf[B]
implicit def bToA(b: B): A = a.asInstanceOf[A]
implicit def convertSeq[T, U](s: Seq[T]): Seq[U] = s.map(_.asInstanceOf[U])
将起作用,因为我知道扩展A
的所有类型也扩展B
,但编译器并不知道这一点。是否有类型安全的方法来做到这一点?
编辑以添加更具体的细节:
trait A
trait B
class X extends A with B
class Y extends A with B
class Z extends A with B
def doSomething(): Seq[A] = Seq(new X(), new Y(), new Z())
def publicFacingMethod1(): Seq[A] = doSomething()
// how can I do this?
def publicFacingMethod2(): Seq[B] = doSomething()
答案 0 :(得分:0)
你可以写
implicit def convertSeq[T <: A, U >: B](s: Seq[T])(implicit ev: A => B): Seq[U] = s.map(ev)
而不是convertSeq
的定义。