java - 在 scala 中使用 java 格式化程序

标签 java scala

我正在将其他人的 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 的子类。有一个合适的类型:AnyAny 既可以包含 java.lang.Object 的子类,也可以包含 Java 中的原语。如果你说一个方法需要 Any 并传递一个 Int,那么它将被自动装箱,但对于 AnyRef 则不会。

因此,每当您与 Java 交互并且某个方法希望您传递装箱的原语时,您就必须自己强制装箱。您可以在 Scala 中创建一个需要 Any 的方法,然后将其转换为 AnyRef 并调用 Java 等价物,如果您要多次调用该方法,事情会变得更容易.

关于java - 在 scala 中使用 java 格式化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12033066/

相关文章:

scala - Spark - 另一个转换中的 Rdd 转换

java - Spring:解析url以获取过滤器

java - Hbase方案设计-最佳实践

java - 我似乎无法从 PLSQL 调用 java

java - System.gc()什么时候做某事?

scala - 错误:对象rocksdb不是软件包orgs的成员

java - 如何将数据库AWS secret 传递到tomcat context.xml中?

scala - 在 ScalaCheck 中生成任意 Function1

scala - 有趣的 DSL,在 Scala 中实现?

scala - 在Apache Spark中删除空的DataFrame分区