重命名导入的静态函数有什么问题?

时间:2010-09-06 10:51:36

标签: scala import

考虑以下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的成员”

有什么区别?

3 个答案:

答案 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)