Scala中Int和Integer有什么区别?

时间:2009-08-12 22:54:26

标签: scala types integer int

我正在处理一个我声明为Integer的变量并发现>不是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之间有什么区别?我看到了弃用警告,但我不清楚为什么它被弃用,并且鉴于它已经存在,为什么它没有&gt;方法

5 个答案:

答案 0 :(得分:43)

“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。

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

答案 1 :(得分:4)

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

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

但您仍会收到弃用警告。

答案 2 :(得分:4)

我认为您遇到的问题必须是对值类型进行装箱/拆箱以及使用Java类Integer。

我认为答案就在这里:Boxing and unboxing in Scala。 Scala中没有任何隐藏的拆箱。您已将 i 定义为Java类Integer,但在 i&gt;中3 ,正在对待3和int。

答案 3 :(得分:2)

Integer从java.lang.Integer导入,仅用于与Java兼容。由于它是一个Java类,当然它不能有一个名为“&lt;”的方法。

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

答案 4 :(得分:1)

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

现在,您可能想知道为什么会出现这种类型?好吧,原始类型不能作为引用传递,因此您无法将int传递给期望java.lang.Object的方法,例如,等同于Scala的AnyRef。为此,您将int放在Integer对象中,然后传递Integer