在for循环中键入不匹配,Scala

时间:2016-06-26 17:49:10

标签: scala

我遇到了一个持久性错误。

var pageArray = new Array[ImageIcon](tempDir.size)
for (page <- tempDir.toList) {
    pageArray += new ImageIcon(page.getAbsolutePath)
}
Some(new Pages(pageArray)) //returns class with constructor Array[ImageIcon]

当我尝试编译时,这段代码会产生类型不匹配错误:

Error:(43, 18) type mismatch;
 found   : javax.swing.ImageIcon
 required: String
                pageArray += new ImageIcon(page.getAbsolutePath)
                             ^

我不明白它从哪里获取String,当我尝试这段代码时:

var pageArray = new Array[ImageIcon](tempDir.size)
for (page <- tempDir.toList) {
    pageArray += "test" //new ImageIcon(page.getAbsolutePath)
}
Some(new Pages(pageArray)) //returns class with constructor Array[ImageIcon]

我得到以下内容:

Error:(43, 15) type mismatch;
 found   : String
 required: Array[javax.swing.ImageIcon]
                pageArray += "test"//new ImageIcon(page.getAbsolutePath)
                          ^

1 个答案:

答案 0 :(得分:2)

首先,+=不适合使用 - 将值附加到可以使用的数组:+

scala> var intArray = new Array[Int](4)
intArray: Array[Int] = Array(0, 0, 0, 0)

scala> intArray :+ 5
res2: Array[Int] = Array(0, 0, 0, 0, 5)

其次,正如您在上面的示例中所看到的那样,创建大小为tempDir.size的数组然后追加对您来说没有多大意义 - 您&#39 ; ll最终得到一个大小为2 * tempDir.size的数组。

更好地实现我假设您尝试做的事情:

tempDir.map(page => new ImageIcon(page.getAbsolutePath)).toArray

这将简单地创建一个新的数组,其中每个原始集合的值使用提供的匿名函数进行映射。使用Scala集合时,通常建议您查找此类高阶函数,而不是迭代集合并更新可变集合。

现在,关于这个String来自何处:由于scala.Array没有+=运算符,编译器会寻找隐式转换为某些内容。它发现了这个:

implicit final class any2stringadd[A](self : A) extends scala.AnyVal  {
  def +(other : scala.Predef.String) : scala.Predef.String = { /* compiled code */ }
}

调用self.toString,然后在右侧附加值,期望它是一个String。