【问题标题】:scala: Type mismatch when trying to concatenate two lists or create a listscala:尝试连接两个列表或创建列表时类型不匹配
【发布时间】:2017-12-14 17:37:20
【问题描述】:

尝试连接两个列表或创建列表时类型不匹配。

我正在尝试用 Scala 实现一个非常简单的二叉树并进行中序遍历, 并在遍历过程中将树节点的值插入List,并在遍历完成后返回List。

我的树定义如下:

abstract class Tree[+T]

case class Node[T](v: T, lft: Tree[T], rght: Tree[T]) extends Tree

case class Leaf[T](v: T) extends Tree

我的中序遍历方法如下:

object prog {
    def inorder[T](t: Tree[T]): List[T] = t match {
        case Node(v, lft, rght) => inorder(lft) ++ (v::inorder(rght))
        case Leaf(lf) => List(lf)
    }
}

Scala 编译器拒绝代码并显示以下错误消息:

tree.scala:28: error: type mismatch;
 found   : List[Any]
 required: List[T]
        case Node(v, lft, rght) => inorder(lft) ++ (v::inorder(rght))
                                                ^
tree.scala:29: error: type mismatch;
 found   : lf.type (with underlying type Any)
 required: T
        case Leaf(lf) => List(lf)
                            ^
two errors found

我搜索了很多,但无法弄清楚我的代码有什么问题。任何提示都是 赞赏。

【问题讨论】:

    标签: scala generics binary-tree


    【解决方案1】:
    case class Node[T](v: T, lft: Tree[T], rght: Tree[T]) extends Tree
    
    case class Leaf[T](v: T) extends Tree
    

    应该是:

    case class Node[T](v: T, lft: Tree[T], rght: Tree[T]) extends Tree[T]
    
    case class Leaf[T](v: T) extends Tree[T]
    

    【讨论】:

    • 其实我很惊讶为什么编译器没有抱怨:case class Leaf[T](v: T) extends Tree
    • 我认为编译器“有帮助”在这里推断Tree[Any]。
    猜你喜欢
    • 2020-06-30
    • 2015-04-23
    • 2020-07-31
    • 2015-02-03
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2013-06-08
    相关资源
    最近更新 更多