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
。