我遇到了一个持久性错误。
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)
^
答案 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。