59

整数として宣言した変数を操作していて、>が整数のメンバーではないことを発見しました。簡単な例を次に示します。

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の違いは何ですか?非推奨の警告が表示されますが、非推奨になった理由と、廃止された理由を考えると、>メソッドがない理由はわかりません。

4

5 に答える 5

54

「整数と整数の違いは何ですか?」

整数は、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への暗黙の変換があります。つまり、整数をとるメソッドでIntを使用できます。

なぜ非推奨になったのかというと、どの種類の整数を扱っているのか混乱を避けるためだったと思います。

于 2009-08-13T13:34:17.090 に答える
6

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

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

ただし、非推奨の警告は引き続き表示されます。

于 2009-08-12T23:28:25.230 に答える
4

あなたが見ている問題は、値型のボックス化/ボックス化解除とJavaクラスIntegerの使用に関係していると思います。

答えはここにあると思います:Scalaでのボクシングとアンボクシング。Scalaには暗黙の開封はありません。iをJavaクラスIntegerとして定義しましたが、 i> 3では、3が処理されてintになります。

于 2009-08-12T23:29:23.997 に答える
4

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

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

于 2009-08-13T12:17:37.837 に答える
3

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

編集:整数から整数への暗黙の変換を宣言することで、この問題を軽減できます。

于 2012-12-13T12:52:48.550 に答える