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)是有区别的。我的理解正确吗?