Предположим, у меня есть простой abstract BinaryTree
с подклассами Node
и Leaf
, и я хочу написать функцию, которая производит List[Leaf]
.Является ли этот прилив необходимым в Scala?
def getLeaves(tree: BinaryTree): List[Leaf] =
tree match {
case Leaf(v) => List(tree.asInstanceOf[Leaf])
case Node(left, right) => getLeaves(left) ++ getLeaves(right)
}
Есть ли способ, чтобы избежать явного asInstanceOf[Leaf]
броска в Leaf
случае? Если я оставлю это, я получаю диагностическое высказывание: found: BinaryTree; требуемый лист.
Другой большой проблемой является то, что для больших деревьев этот код будет создавать переполнения стека. Вы должны либо сделать его хвостом рекурсивным, либо перебрать по дереву, чтобы создать список. – drexin