我正在尝试解决此问题http://projecteuler.net/problem=62,我对此错误感到困惑:
euler.scala:10: error: type mismatch;
found : Array[Any]
required: Array[Int]
Note: Any >: Int, but class Array is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: Int`. (SLS 3.2.10)
master(perm) = if (master.contains(perm)) master(perm) :+ cube else Array(cube)
^
one error found
问题可能是因为BigInt试图存储在一个数组中,但显然没有像Array这样的数组[BigInt]
以下是我的代码:
import scala.util.control.Breaks._
var m = new scala.collection.mutable.LinkedHashMap[String,Array[Int]]
var master = m.withDefaultValue(Array.empty[Int])
val range = 345 to 9999
range.foreach { n =>
val cube = BigInt(n) * n * n
val perm = cube.toString.map(_.asDigit).mkString("")
master(perm) = if (master.contains(perm)) master(perm) :+ cube else Array(cube)
}
master.values.foreach { value =>
if (value.length >= 5) {
println (Math.cbrt(value(0)))
break
}
}
答案 0 :(得分:3)
cube的类型为BigInt。所以Array(cube)的类型为Array [BigInt]
master(perm)的类型是Array [Int],你正在尝试
Array[Int] :+ BigInt => Array[Int], which does not work.
建议:制作BigInt类型的所有数组。
所以:
var m = new scala.collection.mutable.LinkedHashMap[String,Array[BigInt]]
var master = m.withDefaultValue(Array.empty[BigInt])
还要考虑使用List而不是数组。那:+运算符每次都会分配一个新数组。如果您使用列表,它们更智能,将更有效地执行这些不可变操作。
答案 1 :(得分:0)
有Array[BigInt]
,但与Array[Int]
不同。事实上,BigInt
和Int
的常见超类型是Any
,这就是为什么会出现在您的错误消息中:当您追加cube
时,这是一个BigInt
到master(perm)
,即Array[Int]
,您Array
同时拥有Int
和BigInt
,支持两者的唯一类型是Array[Any]
。