gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:59:05 32 4
gpt4 key购买 nike

我正在将其他人的 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com