假设我们有以下类型:
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
的情况下以优雅的方式解决这个问题?