1

例:

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)
                     ^

クラスのオーバーロードされたformatメソッドをScala が処理できないのはなぜですか?String

使用: Windows 7 64 ビットの Scala 2.9.2。

4

2 に答える 2

15

代わりにこれを使用してください:

"%d".format(2)

このString.formatメソッドは Java のものであるため、 のサブタイプである入力パラメータが必要ですjava.lang.Object。ScalaIntjava.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
                                 ^

AnyValこれについてもっと学ぶには、Scala のと型の区別を読んでくださいAnyRefIntegerJava では、効率のためにオブジェクト ( など) とプリミティブ ( など) を区別していintます。Scala にも同様の違いがあります。すべての型は から拡張されAnyますが、「値型」(基本的にプリミティブに対応する) は から拡張されAnyVal、他のすべてはAnyRef(基本的にjava.lang.Object) から拡張されます。詳細はこちらをご覧ください

したがって、使用するには、次String.formatの Java に置き換える必要がありIntegerますObject

String.format("%d", new java.lang.Integer(2))

ただし、これは行わないでください。上記のように、Scala の方法で使用してください。

于 2012-09-16T17:15:52.287 に答える
2

最初のオーバーロードされた定義は一致できません。最初の引数がLocaleであるため、文字列を指定しました。

2 番目の引数は の vararg パラメータですがObject、 を指定したため、2 番目の選択肢は一致しませんInt。は ( Scalaで呼び出される)Intのサブタイプではありません。Java は自動ボクシングによってそれを「修正」しますが、Scala 型システムでは、プリミティブ型から への自動変換はありません。ObjectAnyRefIntjava.lang.Integer

Java 定義がジェネリックである場合format[T](f: String, args: T*)、Scala の無制限の型パラメーターはプリミティブ型にも及ぶため、Scala は呼び出しを許可します。

于 2012-09-16T18:33:04.910 に答える