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

标签 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)
                     ^

为什么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 对 AnyValAnyRef 类型的区分。为了提高效率,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/

相关文章:

c# - 方法 `HideToast'的重载不带有 `0'参数

java - 是否可以使用字符串 []args 和 varargs 重载 main 方法?如果不是那么为什么?

java - java中输出类型不同时的工厂模式

java - 无法导入包 org.objectweb.asm

scala - 如果 `for` 中的至少一个组件为 None,则 for-comprehension 返回 None

java - Scala - 运行时字符串模板

python-2.7 - 在 opencv 中调用 "overloaded member function"

java - 类名中带有数字的 Stacktrace - 为什么?

java - 如何使用java编写和读取.xps文件?

scala - 如何在spark scala中设置数据集的数组类型