Scala:类型安全的方式来隐式转换抽象类型

时间:2017-10-30 16:07:48

标签: scala implicit-conversion

假设我有两个抽象的,不相关的类型AB(密封的特征,如果有任何不同,没有实现细节)。我希望能够在期望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()

1 个答案:

答案 0 :(得分:0)

你可以写

implicit def convertSeq[T <: A, U >: B](s: Seq[T])(implicit ev: A => B): Seq[U] = s.map(ev)

而不是convertSeq的定义。