Int和Integer在Scala中有什么区别?

我正在使用一个我声明为Integer的variables,并发现>不是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有什么区别? 我看到了这个弃用警告,但是我不清楚为什么它被弃用,并且因为这个原因,为什么它没有方法。

“Integer和Int有什么不同?

整数只是java.lang.Integer的别名。 Int是具有额外function的Scala整数。

在Predef.scala看,你可以看到这个别名:

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

但是,如果需要,则存在从Int到java.lang.Integer的隐式转换,这意味着您可以在采用Integer的方法中使用Int。

至于为什么它被弃用,我只能假设它是为了避免混淆你正在使用哪种types的整数。

我认为你所看到的问题必须对值types进行装箱/拆箱以及使用Java类Integer。

我认为答案在这里: Scala中的拳击和拆箱 。 Scala中没有暗含的拆箱。 你已经将定义为Java类Integer,但是在i> 3中 ,3正在被处理,并且是int。

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

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

尽pipe如此,您仍然会收到弃用警告。

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

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

Integer是一个Java类java.lang.Integer 。 它与Java的原始typesint ,它不是一个类。 它不能被定义,因为Java不允许为类定义运算符。

现在,你可能想知道为什么这样的types存在? 那么原始types不能作为引用传递,所以你不能将一个int传递给期望java.lang.Object的方法,例如相当于Scala的AnyRef 。 要做到这一点,你把这个int放在Integer对象中,然后传递Integer