例子:
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)
^
为什么Scala不能处理String
类重载的format
方法?
使用:Windows 7 64 位上的 Scala 2.9.2。
最佳答案
改用这个:
"%d".format(2)
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
^
要了解更多相关信息,您应该阅读 Scala 对 AnyVal
和 AnyRef
类型的区分。为了提高效率,Java 区分对象(如 Integer
)和基元(如 int
)。 Scala 也有类似的区别。所有类型都从 Any
扩展,但是“值类型”(基本上对应于基元)从 AnyVal
扩展,其他所有类型都从 AnyRef
扩展(基本上 java.lang.Object
)。阅读更多 here .
因此,要使用 String.format
,您必须将其替换为 Java Integer
,这是一个 Object
:
String.format("%d", new java.lang.Integer(2))
但是不要这样做;如上所述,只需按照 Scala 方式使用即可。
关于java - Scala 2.9.2 无法处理 String 类的重载格式方法 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12448937/