Scala 2.9.2无法处理String类的重载格式方法 - 为什么?

Joh*_*ood 1 java scala overloading

例:

scala> String.format("%d", 2)
<console>:8: error: overloaded method value format with alternatives:
  (java.util.Locale,java.lang.String,<repeated...>[java.lang.Object])java.lang.String <and>
  (java.lang.String,<repeated...>[java.lang.Object])java.lang.String
 cannot be applied to (java.lang.String, Int)
              String.format("%d", 2)
                     ^
Run Code Online (Sandbox Code Playgroud)

为什么Scala不能处理类的重载format方法String

使用:Windows 7 64位上的Scala 2.9.2.

dhg*_*dhg 15

请改用:

"%d".format(2)
Run Code Online (Sandbox Code Playgroud)

String.format方法是Java的东西,因此它期望输入参数是子类型java.lang.Object.Scala Int不是java.lang.Object:

scala> val i: java.lang.Object = 2
<console>:7: error: type mismatch;
 found   : Int(2)
 required: java.lang.Object
Note: an implicit exists from scala.Int => java.lang.Integer, but
methods inherited from Object are rendered ambiguous.  This is to avoid
a blanket implicit which would convert any scala.Int to any AnyRef.
You may wish to use a type ascription: `x: java.lang.Integer`.
       val i: java.lang.Object = 2
                                 ^
Run Code Online (Sandbox Code Playgroud)

要了解有关此内容的更多信息,您应该阅读Scala对类型AnyValAnyRef类型的区分.为了提高效率,Java在对象(如Integer)和基元(如int)之间有区别.Scala也有类似的区别.所有类型都延伸Any,但"值类型"(基本上对应于基元)延伸AnyVal而且其他所有内容都从AnyRef(基本上java.lang.Object)延伸.在这里阅读更多.

所以,要使用String.format你必须用Java替换它Integer,这是一个Object:

String.format("%d", new java.lang.Integer(2))
Run Code Online (Sandbox Code Playgroud)

但是不要这样做; 如上所述,只需使用Scala方式即可.