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

整数和整数有什么区别?我看到了弃用警告,但我不清楚它为什么被弃用,鉴于它已经被弃用,为什么它没有 > 方法。

4

5 回答 5

54

“整数和整数有什么区别?”

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。

至于为什么不推荐使用它,我只能假设它是为了避免混淆您正在使用哪种整数。

于 2009-08-13T13:34:17.090 回答
6

Integer 从 java.lang.Integer 导入,仅用于与 Java 兼容。既然是Java类,当然不能有一个叫“<”的方法。编辑:您可以通过声明从 Integer 到 Int 的隐式转换来缓解此问题。

 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

Integer是一个 Java 类,java.lang.Integer. 它不同于 Java 的原始类型int,它不是一个类。它不能<定义,因为 Java 不允许为类定义运算符。

现在,您可能想知道为什么会存在这种类型?好吧,原始类型不能作为引用传递,所以你不能将 an 传递int给一个方法 expecting ,例如java.lang.Object,等效于 Scala 的。AnyRef为此,您将其int放入一个Integer对象中,然后将Integer.

于 2009-08-13T12:17:37.837 回答
3

Integer 从 java.lang.Integer 导入,仅用于与 Java 兼容。既然是Java类,当然不能有一个叫“<”的方法。

编辑:您可以通过声明从 Integer 到 Int 的隐式转换来缓解此问题。

于 2012-12-13T12:52:48.550 回答