我正在将其他人的 java 代码转换为 scala(出于好奇,这是示例 here )并且我遇到了以下编译器错误(稍微简化):
var out = new Formatter(new StringBuilder(), Locale.US)
out.format("%s-%d ", someObject, someInteger);
这是我收到的错误消息:
[error] (java.util.Locale,java.lang.String,<repeated...>
[java.lang.Object])java.util.Formatter <and>
[error] (java.lang.String,<repeated...>[java.lang.Object])java.util.Formatter
[error] cannot be applied to (java.lang.String, java.lang.Object, Int)
...
[error] one error found
如果我将第二行更改为:
out.format("%s-%d ", someObject, someInteger.asInstanceOf[Object]);
谁能解释这是为什么?
这是否意味着在 java 中可以在需要对象参数的地方传递整数但在 scala 中不行?
最佳答案
其他答案都补充了一些东西,但我不确定他们解释了问题是什么。
这一切都归结为 Int
在 Scala 中是一个类,而 int
在 Java 中是一个原语。因此,在 Java 中,当您编写一个方法需要一个 Object
,并且您传递一个 int
时,Java 将自动装箱 java.lang.Integer
.
现在,Java 的 java.lang.Object
在 Scala 中等价于 AnyRef
,但是 Int
不是 AnyRef
的子类。有一个合适的类型:Any
。 Any
既可以包含 java.lang.Object
的子类,也可以包含 Java 中的原语。如果你说一个方法需要 Any
并传递一个 Int
,那么它将被自动装箱,但对于 AnyRef
则不会。
因此,每当您与 Java 交互并且某个方法希望您传递装箱的原语时,您就必须自己强制装箱。您可以在 Scala 中创建一个需要 Any
的方法,然后将其转换为 AnyRef
并调用 Java 等价物,如果您要多次调用该方法,事情会变得更容易.
关于java - 在 scala 中使用 java 格式化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12033066/