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

Java Scala 2.9.2无法处理String类的重载格式方法-为什么?,java,scala,overloading,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.

例如:

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(“%d”,2)
:8:错误:重载的方法值格式,带有替代项:
(java.util.Locale,java.lang.String,[java.lang.Object])java.lang.String
(java.lang.String[java.lang.Object])java.lang.String
无法应用于(java.lang.String,Int)
字符串格式(“%d”,2)
^
为什么Scala不能处理
String
类的重载
format
方法

在64位Windows 7上使用: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
                                 ^
String.format("%d", new java.lang.Integer(2))
但不要这样做;如上所述,只需使用Scala方式即可。

使用以下方式:

"%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
                                 ^
String.format("%d", new java.lang.Integer(2))

但不要这样做;如上所述,只需使用Scala方式即可。

第一个重载定义无法匹配,因为第一个参数是
Locale
,而您提供了一个字符串

第二个选项无法匹配,因为第二个参数是
对象
的vararg参数,但您提供了
Int
Int
不是
Object
的子类型(在Scala中称为
AnyRef
)。Java通过自动装箱来“修复”它,但在Scala类型系统中,没有从基元类型
Int
Java.lang.Integer
的自动转换


如果Java定义是泛型的,比如
format[T](f:String,args:T*)
,Scala将允许您调用,因为Scala中的无界类型参数也覆盖基本类型。

第一个重载定义无法匹配,因为第一个参数是
Locale
,而您提供了一个字符串

第二个选项无法匹配,因为第二个参数是
对象
的vararg参数,但您提供了
Int
Int
不是
Object
的子类型(在Scala中称为
AnyRef
)。Java通过自动装箱来“修复”它,但在Scala类型系统中,没有从基元类型
Int
Java.lang.Integer
的自动转换


如果Java定义是泛型的,比如
format[T](f:String,args:T*)
,Scala将允许您调用,因为Scala中的无界类型参数也覆盖基本类型。

Int有什么特别之处?谢谢。但是Scala不应该在这里进行自动转换吗?例如,方法
String.valueOf(i)
适用于
vali:Int=2
。感谢您扩展您的答案,这很有帮助。但现在我想知道,为什么Scala的Int不是Java对象的子类型。我一直认为所有类(Scala和Java)都是对象类的子类型?@John,我补充了一些关于哪些不是对象类的内容Objects@dhg好的,我明白了,谢谢。因此,即使所有类(包括Scala的Int)都是Object类的子类型,也没有Int到Object的隐式转换,因为AnyVal和AnyRef(正如您所写的来自Java)是有区别的。我的理解正确吗?Int有什么特别之处?谢谢。但是Scala不应该在这里进行自动转换吗?例如,方法
String.valueOf(i)
适用于
vali:Int=2
。感谢您扩展您的答案,这很有帮助。但现在我想知道,为什么Scala的Int不是Java对象的子类型。我一直认为所有类(Scala和Java)都是对象类的子类型?@John,我补充了一些关于哪些不是对象类的内容Objects@dhg好的,我明白了,谢谢。因此,即使所有类(包括Scala的Int)都是Object类的子类型,也没有Int到Object的隐式转换,因为AnyVal和AnyRef(正如您所写的来自Java)是有区别的。我的理解正确吗?