私は整数として宣言した変数を使用していて、>が整数のメンバーではないことを発見しました。以下に簡単な例を示します。
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の違いは何ですか?非推奨の警告が表示されますが、なぜ非推奨になったのか、また、それがあったのに、なぜ>メソッドがないのかは不明です。
「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を使用できます。
なぜそれが非推奨であるかについては、どの整数の種類で作業していたのかについての混乱を避けるためであるとしか推測できません。
IntegerはJava.lang.Integerからインポートされ、Javaとの互換性のためだけにあります。 Java=クラスであるため、「<」というメソッドを使用することはできません。編集:IntegerからIntへの暗黙的な変換を宣言することで、この問題を軽減できます。
implicit def toInt(in:Integer) = in.intValue()
ただし、非推奨の警告が表示されます。
あなたが見ている問題は、値型のボックス化/ボックス化解除とJavaクラス整数の使用を行う必要があると思います。
答えはここにあると思います: Scalaでのボックス化とボックス化解除 。 Scalaには暗黙のボックス化解除はありません。 iをJava class Integerとして定義しましたが、 i> 3では、3が処理され、intになります。
Integer
はJavaクラス、Java.lang.Integer
です。これは、Javaのプリミティブ型int
とは異なります。これはクラスではありません。 Javaでは演算子をクラスに定義できないため、<
が定義されています。
さて、なぜそのような型が存在するのか不思議に思うかもしれませんか?まあ、プリミティブ型は参照として渡すことができないので、たとえば、Scalaのint
に相当するJava.lang.Object
を期待するメソッドにAnyRef
を渡すことはできません。そのためには、そのint
をInteger
オブジェクト内に配置してから、Integer
を渡します。
IntegerはJava.lang.Integerからインポートされ、Javaとの互換性のためだけにあります。 Java=クラスであるため、もちろん、「<」というメソッドを持つことはできません。
編集:IntegerからIntへの暗黙の変換を宣言することにより、この問題を軽減できます。