Scala 推断公共超类型

Scala 推断公共超类型,scala,generics,type-inference,Scala,Generics,Type Inference,这就是我要做的 def merge[A, B, C](eithers: Either[A,B]*)(implicit ev1: A <:< C, ev2: B <:< C): Seq[C] = eithers.flatMap(_.fold(Option[C](_), Option[C](_))) 这不起作用:( 它说,不能证明Baz存在一个简单的解决方案,使用方差: def merge[C](eithers: Either[C, C]*): Seq[C]

这就是我要做的

  def merge[A, B, C](eithers: Either[A,B]*)(implicit ev1: A <:< C, ev2: B <:< C): Seq[C] =
     eithers.flatMap(_.fold(Option[C](_), Option[C](_)))
这不起作用:(
它说,
不能证明Baz存在一个简单的解决方案,使用方差:

def merge[C](eithers: Either[C, C]*): Seq[C] = eithers.map(_.fold(x => x, x => x))

使用类型边界而不是隐式参数对我很有用:

def merge[A <: C, B <: C, C](eithers: Either[A,B]*): Seq[C] =
  eithers.flatMap(_.fold(Option[C](_), Option[C](_)))

def merge[A为什么不使用
A,B]扩展[C,C]
,因为存在差异?
val merged: Seq[Foo] = merge(Left[Bar, Baz](new Bar), Right[Bar, Baz](new Baz)) 
merge(input)
  .filter(doILikeIt)
  .map(doSomethingInteresting)
// etc. 
def merge[C](eithers: Either[C, C]*): Seq[C] = eithers.map(_.fold(x => x, x => x))
def merge[A <: C, B <: C, C](eithers: Either[A,B]*): Seq[C] =
  eithers.flatMap(_.fold(Option[C](_), Option[C](_)))