2009-08-12 191 views
45

我正在使用一個我聲明爲Integer的變量,並發現>不是Integer的成員。這裏有一個簡單的例子:Scala中Int和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 

什麼是整數和Int之間的區別是什麼?我看到棄用警告,但我不清楚它爲什麼被棄用,並且鑑於它,它爲什麼沒有方法。

+0

謝謝大家的有用答案。你們都回答我的問題,所以我會讓最高評分的答案升至最高,並將其作爲答案。與此同時,我已將您的所有迴應評爲最高。 – pr1001 2009-08-14 00:53:29

回答

40

「Integer和Int之間有什麼區別?」

整數只是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採用Integer的方法。至於爲什麼它被棄用,我只能假設它是爲了避免任何混淆你正在使用哪種類型的整數。

3

Integer從java.lang.Integer導入,僅用於與Java兼容。既然它是一個Java類,當然它不能有一個叫做「<」的方法。 編輯:你可以通過聲明從Integer到Int的隱式轉換來緩解這個問題。

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

儘管您仍然會收到棄用警告。

4

我認爲你看到的問題必須對值類型進行裝箱/拆箱以及使用Java類Integer。

我認爲答案在這裏:Boxing and unboxing in Scala。 Scala中沒有暗含的拆箱。你已經定義了作爲Java類整數,但在i> 3,3正在處理和int。

+0

現在鏈接已損壞。 – 203 2015-11-23 20:36:45

1

Integer是Java類,java.lang.Integer。它與Java的原始類型int不同,它不是類。它不能定義<,因爲Java不允許爲類定義運算符。

現在,你可能想知道爲什麼這樣的類型存在?那麼原始類型不能作爲引用傳遞,因此您無法將int傳遞給期望爲java.lang.Object的方法,例如相當於Scala的AnyRef。爲此,請將int放入Integer對象內,然後通過Integer

1

Integer從java.lang.Integer導入,僅用於與Java兼容。既然它是一個Java類,當然它不能有一個叫做「<」的方法。

編輯:你可以通過聲明一個從Integer到Int的隱式轉換來緩解這個問題。

相關問題