考虑这个(人为的)代码:
sealed abstract class MyCaseClass(val num : Long)
case class CaseOne(override val num : Long) extends MyCaseClass(num)
case class CaseTwo(override val num : Long) extends MyCaseClass(num)
val groupedObs : Observable[(Long, Observable[MyCaseClass])] =
Observable(1 to 20) map {
x => if (x > 10) CaseOne(x) else CaseTwo(x)
} groupBy {
case CaseOne(x) => x % 2 == 0
case CaseTwo(x) => x % 2 == 0
}
groupedObs subscribe ( (onNext : (Long,Observable[MyCaseClass])) => onNext match {
case (even : Boolean, o : Observable[CaseOne] ) => println("Case one")
case (even : Boolean, o : Observable[CaseTwo] ) => println("Case two")
}
)
它创建了一个 observable,其中前 10 个是CaseOne
,接下来是CaseTwo
。然后根据它们是偶数还是奇数对它们进行分组。Observable[(Long, Observable[MyCaseClass])]
因此,根据 RX-Java 规范,分组的 observable 最终是 type 。
然而,当我们订阅一个 'groupedby' observable 时,类型擦除意味着嵌套的 Observable 的签名丢失了,即我们无法判断它是 CaseOne 还是 CaseTwo(它变成了 type Any
) - 编译器会对此发出警告,所以输出是
Case one
Case one
Case one
...
我的问题是,在上述场景中,你如何处理嵌套 Observable 的类型擦除?
到目前为止,我唯一的解决方法是在键中包含一个额外的值,用于标识嵌套的 Observable 类型,然后将(使用asInstance
)转换为这种类型。但这不是很好。
还要注意,虽然我没有even
在这个例子中使用,但它直接反映了我的问题的结构。