考虑以下Scala代码:
object MainObject {
def main(args: Array[String]) {
import Integer.{
parseInt => atoi
}
println(atoi("5")+2);
println((args map atoi).foldLeft(0)(_ + _));
}
第一个println工作正常并输出7,但第二个,尝试映射字符串数组对函数atoi不起作用,错误“值atoi不是对象java.lang.Integer的成员”
有什么区别?
答案 0 :(得分:5)
看起来像个错误。这是一个更简单的例子。
object A {
def a(x: Any) = x
def b = ()
}
{
A.a(0)
A.a _
}
{
import A.a
a(0)
a _
}
{
import A.{a => aa}
aa(0)
aa _ // error: value aa is not a member of object this.A
}
{
import A.{b => bb}
bb
bb _
}
答案 1 :(得分:4)
这是因为它无法分辨使用哪个atoi。 parseInt(String)和parseInt(String,int)有两种可能性。来自REPL:
scala> atoi <console>:7: error: ambiguous reference to overloaded definition, both method parseInt in object Integer of type (x$1: java.lang.String)Int and method parseInt in object Integer of type (x$1: java.lang.String,x$2: Int)Int match expected type ?
atoi
你需要具体说明使用哪一个,这将有效:
println((args map ( atoi(_))).foldLeft(0)(_ + _));
答案 2 :(得分:2)
这不是您问题的答案,但您可以使用toInt
中的StringOps
方法代替Integer.parseInt
。
scala> Array("89", "78").map(_.toInt)
res0: Array[Int] = Array(89, 78)