2009-08-12 13 views
45

私はIntegerとして宣言していた変数で作業していましたが、> Integerのメンバーではないことを発見しました。ここでは簡単な例です:ScalaのIntとIntegerの違いは何ですか?

scala> i 
warning: there were deprecation warnings; re-run with -deprecation for details 
res28: Integer = 3 

scala> i > 3 
<console>:6: error: value > is not a member of Integer 
     i > 3 
     ^

はintにいることの比較:

scala> j 
res30: Int = 3 

scala> j > 3 
res31: Boolean = false 

整数とのIntの違いは何ですか?私は非推奨の警告を見ていますが、それが非推奨であった理由と、それが理由で、なぜそれがなぜメソッドを持たないのかはわかりません。

+0

ありがとうございました。有用な回答です。あなたはすべて私の質問に答えるので、最高の定格応答を上に上げ、それを答えにします。その間、私はすべてのあなたの応答を評価しました。 – pr1001

答えて

40

「IntegerとIntの違いは何ですか?」

整数はjava.lang.Integerの単なるエイリアスです。 Intは余分な機能を持つScala整数です。あなたはでのIntを使用できることを意味し、それを必要とする場合はjava.lang.IntegerへのIntからの暗黙的な変換がある、しかし

/** @deprecated use <code>java.lang.Integer</code> instead */ 
    @deprecated type Integer = java.lang.Integer 

Predef.scalaに見ると、あなたはこのエイリアスを見ることができますIntegerをとるメソッド

なぜ非推奨になっているのかといえば、どの種類の整数を扱っているのか混同しないようにすることができました。

3

整数はjava.lang.Integerからインポートされ、Javaとの互換性のためにのみ使用されます。それはJavaクラスなので、もちろん "<"というメソッドを持つことはできません。 編集:IntegerからIntへの暗黙的な変換を宣言することで、この問題を軽減できます。

implicit def toInt(in:Integer) = in.intValue() 

あなたはまだ推奨されなくなることを警告します。

4

私はあなたが見ている問題は、値の種類のボクシング/ボックス解除とJavaクラスIntegerの使用をしなければならないと思います。

回答はこちらです:Boxing and unboxing in Scala Scalaにはアンボクシングのアンボクシングはありません。 をJavaクラスIntegerとして定義しましたが、i> 3で、3が処理され、intが処理されています。

+0

リンクが壊れています。 – 203

1

Integerは、Javaクラスのjava.lang.Integerです。これは、クラスではないJavaのプリミティブ型intとは異なります。 <を定義することはできません。Javaではクラスに対して演算子を定義できないためです。

ここで、なぜそのようなタイプが存在するのでしょうか?まあ、プリミティブ型は参照として渡すことはできません。intを、例えばAnyRefに相当するjava.lang.Objectが必要なメソッドに渡すことはできません。これを行うには、をIntegerオブジェクトに入れて、Integerを渡します。

1

整数はjava.lang.Integerからインポートされ、Javaとの互換性のためだけに使用されます。それはJavaクラスなので、もちろん "<"というメソッドを持つことはできません。

EDIT:IntegerからIntへの暗黙的な変換を宣言することで、この問題を軽減できます。

関連する問題