1
给出一个假设的可变链表(假设这是一个给定的结构 - 所以没有要改变它的建议,请):避免类型转换的模式匹配
trait CList[T]
trait CNil [T] extends CList[T]
trait CCons[T] extends CList[T] {
def head: T
def tail: CList[T]
}
并给予Scala的类型擦除,怎么能我遍历它没有铸造:
@annotation.tailrec def lastValue[T](l: CList[T]): Option[T] = l match {
case _: CNil [_] => None
case c: CCons[_] => lastValue(c.asInstanceOf[CCons[T]]) // ouch!
}
CList
是不变的T
所以应该有办法做到这一点?
嗯,还不错。是的,我可以让他们在原始文件中,这不是问题。 (当然,对于前一个值的正确跟踪,你是对的)。我认为必须有一个提取模式,但无法弄清楚。 –
看我们在选择头部还是尾部时,我们意外不需要在'case c:CCons [_]'后面投射。也许编译器认为'c'与CCons [_]'是一样的'CList [T],它明确地解析为'CCons [T]'?... –