按类型参数从列表中收集通用对象

时间:2016-06-22 14:31:36

标签: scala types scala-2.11

假设我们有以下类型:

sealed abstract class X

case object X1 extends X
case object X2 extends X
case object X3 extends X

class C[XN <: X](val xn: XN)

问题:我希望,import scala.language.existentials; val l: List[C[XN] forSome { type XN <: X }]能够为所选C[XN]收集所有XN <: X

这当然不起作用,因为无法进行模式匹配以将l的元素强制转换为所需类型。我的第一个想法是将T定义如下:

type T = List[(XN, C[XN]) forSome { type XN <: X}]

我希望在模式匹配每个元组的左侧按类型,我会说服编译器所需的第二个元素的类型。这是我定义的功能:

def collectT[XN : Manifest](t: T): List[C[XN]] = {
  t.collect {
    case (xn: XN, cxn) ⇒
      cxn: C[XN]
    }
}

编译错误:编译时,出现以下错误:

[error] /Users/Justin/Code/quantemplate-datapipeline/src/test/scala/random/TypeQuandary.scala:21: type mismatch;
[error]  found   : random.TypeQuandary.C[XN(in method applyOrElse)] where type XN(in method applyOrElse) <: random.TypeQuandary.X
[error]  required: random.TypeQuandary.C[XN(in method collectT)]
[error]         cxn: C[XN]
[error]         ^
[error] one error found
[error] (test:compileIncremental) Compilation failed
[error] Total time: 1 s, completed 22-Jun-2016 15:26:53

有没有办法在不使用.asInstanceOf的情况下以优雅的方式解决这个问题?

0 个答案:

没有答案