web-dev-qa-db-ja.com

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

IntegerとIntの違いは何ですか?非推奨の警告が表示されますが、なぜ非推奨になったのか、また、それがあったのに、なぜ>メソッドがないのかは不明です。

52
pr1001

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

Integerは、Java.lang.Integerの単なるエイリアスです。 Intは、Scala整数で、追加機能を備えています。

Predef.scalaを見ると、これがエイリアスであることがわかります。

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

ただし、必要に応じて、IntからJava.lang.Integerへの暗黙的な変換が行われます。つまり、Integerを取るメソッドでIntを使用できます。

なぜそれが非推奨であるかについては、どの整数の種類で作業していたのかについての混乱を避けるためであるとしか推測できません。

43

IntegerはJava.lang.Integerからインポートされ、Javaとの互換性のためだけにあります。 Java=クラスであるため、「<」というメソッドを使用することはできません。編集:IntegerからIntへの暗黙的な変換を宣言することで、この問題を軽減できます。

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

ただし、非推奨の警告が表示されます。

5
Kim Stebel

あなたが見ている問題は、値型のボックス化/ボックス化解除とJavaクラス整数の使用を行う必要があると思います。

答えはここにあると思います: Scalaでのボックス化とボックス化解除 。 Scalaには暗黙のボックス化解除はありません。 iをJava class Integerとして定義しましたが、 i> 3では、3が処理され、intになります。

4
Valentein

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

さて、なぜそのような型が存在するのか不思議に思うかもしれませんか?まあ、プリミティブ型は参照として渡すことができないので、たとえば、Scalaのintに相当するJava.lang.Objectを期待するメソッドにAnyRefを渡すことはできません。そのためには、そのintIntegerオブジェクト内に配置してから、Integerを渡します。

2

IntegerはJava.lang.Integerからインポートされ、Javaとの互換性のためだけにあります。 Java=クラスであるため、もちろん、「<」というメソッドを持つことはできません。

編集:IntegerからIntへの暗黙の変換を宣言することにより、この問題を軽減できます。

2
deepak