【问题标题】:"type mismatch" error while using :+ method on a List在列表上使用 :+ 方法时出现“类型不匹配”错误
【发布时间】:2017-07-21 00:09:37
【问题描述】:

我刚刚开始学习 scala。我正在尝试编写一个函数来反转任意类型的列表。

下面是代码:

def reverse [A] (l:List[A]):List[A] = {
     val size:Int = lenList(l) // i have implemented this func separately
     if (l.isEmpty) List()
     else {
              var newList = List()
              for (i <- 1 to size)
              {
                  var temp = l(size - i)
                  newList = newList :+ temp //type mismatch error here
              }
     newList
    }
   }'

这是上面代码编译时的错误:

当我将newList 声明更改为var newList = List[A]()(与作为参数传递的List 相同的类型)时,代码编译成功。

我的问题是:

  1. newList 的类型为List[Nothing]temptype A 的元素时,为什么行newList = newList :+ temp 上会出现类型不匹配?

  2. 为什么编译器在语句中没有List[A]类型时会说Found:List[A]

  3. 谁能告诉我这个特定类型不匹配错误发生的原因?

  4. 另外我想知道为什么我更改声明时编译的代码是什么原因?

  5. 我的声明对最初引发错误的语句有什么影响?

我相信在这种情况下下面的错误消息是合理的

found:List[Nothing] 
Required:List[A] 

而不是我遇到的:

found:List[A]
Required:List[Nothing]

由于声明中使用了List[Nothing] 类型的newList,并且我尝试附加的元素是type A,因此可以理解所需的类型应该是List[A]

【问题讨论】:

  • 调用List() 对应于工厂List.apply[T],其中T 被推断为Nothing,因为您没有指定它,在val 声明中也没有指定显式类型或在工厂电话上。 val newList: List[A] = List()val newList = List.empty[A]

标签: scala scala-collections


【解决方案1】:

当你这样做时:

var newList = List()

newList 的类型是List[Nothing]。如果你是 scala 的新手,Nothing 是所有其他类型的子类型。实际上,当我们必须向它写入任何数据时,它是无用的。我们会看到为什么会这样。

当您执行 newList :+ temp 时,您会将 temp(A 类型)附加到 List[Nothing]。所以对于编译器,类型推断预测这个新列表的类型必须是List[A]。 (想象一下,如果你创建一个狮子、鸟类和蛇的列表,你不会把这个新列表称为动物列表吗?)

所以生成的列表是List[A] 类型。然后你尝试将它分配给它自己 (newList =)。最初是List[Nothing]。在 scala 中,使用var,您可以更改值但不能更改类型。在这里,我们尝试将newList 的类型从List[Nothing] 更改为List[A]

因此错误及其解释

【讨论】:

  • 感谢您的解释。现在我知道found:List[A] 指的是表达式'newList :+ temp' 返回的值的结果类型,这与newList 的所需类型List[Nothing] 不匹配。
【解决方案2】:

使用newList.+:(temp) 追加到列表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多