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
で不変であるので、これを実現するための方法があるはず?
Hmmm、悪くない。はい、元のファイルに入れても問題ありません。 (そして、あなたはもちろん、以前の値の適切な追跡について)。私は抽出パターンがなければならないと思ったが、それを理解できなかった。 –
頭や尾を選択したときに 'case c:CCons [_]'の後にキャストする必要がないことを見てください。たぶん、コンパイラは 'c'を 'CCons [T]'に解決する '' CCist [_] 'と' 'CList [T] ''のように考えるでしょうか? –