2009-10-14 9 views
14

スカラーインタプリタに次のように入力します。Int vs Integer:タイプの不一致、見つかった:Int、required:String

val a : Integer = 1; 
val b : Integer = a + 1; 

メッセージが表示されます。

<console>:5: error: type mismatch; 
found : Int(1) 
required: String 
     val b : Integer = a +1 
          ^

なぜですか?これをどうすれば解決できますか? 今回は、Javaの相互運用性の理由からIntegersが必要です。

答えて

19

この質問はほとんどの複製である:Scala can't multiply java Doubles? - アイデアは類似しているとして、あなたは、同様my answerで見ることができます。

Eastsun

が既に示唆したように、その答えは、(基本的にプリミティブ箱入りintjava.lang.IntegerからJVMプリミティブ整数を表すScalaの方法であるscala.Int暗黙変換あります。

implicit def javaToScalaInt(d: java.lang.Integer) = d.intValue 

相互運用性が達成されました。コードをコンパイルしても問題ありません。そしてjava.lang.Integerが必要なscala.Intを使用するコードは、オートボックスのためうまく動作するようです。したがって、次の作品:また

def foo(d: java.lang.Integer) = println(d) 
val z: scala.Int = 1 
foo(z) 

michaelkebeIntegerタイプを使用していない、言ったように - それが廃止されており、おそらくScalaの2.8で削除されようとしているとして、実際にscala.Predef.Integerの省略形です。

EDIT:理由を答えるのを忘れました。あなたが得るエラーはおそらくscala.Predef.Integera + "my String"が文字列連結を意味するJavaの構文的な砂糖を模倣しようとしたことでしょう。aintです。したがって、scala.Predef.Integerタイプの+メソッドは、文字列の連結(Stringを予期)のみを行い、自然な整数の加算は行いません。

- Flaviu Cipcigan

0

まず、Integerの代わりにjava.lang.Integerを使用してください。

現在、私はなぜエラーが発生するのかわかりません。

ajava.lang.Integerのインスタンスであり、このタイプには+という名前のメソッドはありません。さらに、Intへの暗黙の変換はありません。

は、あなたがこれを試すことができ、これを解決するには、次の

 
scala> val a: java.lang.Integer = 1 
a: java.lang.Integer = 1 

scala> val b: java.lang.Integer = a.intValue + 1 
b: java.lang.Integer = 2 
2
Welcome to Scala version 2.7.3.final (Java HotSpot(TM) Client VM, Java 1.6.0_16). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> implicit def javaIntToScala(n: java.lang.Integer) = n.intValue 

javaIntToScala: (java.lang.Integer)Int 

scala> val a: java.lang.Integer = 1 

a: java.lang.Integer = 1 

scala> val b: java.lang.Integer = a + 1 

b: java.lang.Integer = 2 
関連する問題