Подтвердить что ты не робот

В чем разница между Int и Integer в Scala?

Я работал с переменной, которую я объявил как 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? Я вижу предупреждение об устаревании, но мне непонятно, почему он устарел и, учитывая, что это было, почему у него нет методa > .

4b9b3361

Ответ 1

"Каковы различия между 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.

Что касается того, почему он устарел, я могу только предположить, что это было во избежание путаницы в отношении какого типа целого, с которым вы работали.

Ответ 2

Целое число импортируется из java.lang.Integer и только для совместимости с Java. Поскольку это класс Java, конечно, он не может иметь метод под названием "<". EDIT: вы можете уменьшить эту проблему, объявив неявное преобразование из Integer в Int.

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

Вы все равно получите предупреждение об отказе.

Ответ 3

Я думаю, что проблема, которую вы видите, должна делать бокс/распаковка типов значений и использование класса Java Integer.

Я думаю, что ответ здесь: Бокс и распаковка в Scala. В Scala нет разблокировки implict. Вы определили i как класс Java Integer, но в i > 3, 3 обрабатывается и int.

Ответ 4

Integer - это класс Java, java.lang.Integer. Он отличается от примитивного типа Java int, который не является классом. Он не может иметь <, потому что Java не позволяет операторам определять классы.

Теперь вы можете удивиться, почему такой тип существует вообще? Ну, примитивные типы не могут передаваться как ссылки, поэтому вы не можете передать int методу, ожидающему java.lang.Object, эквивалентному, например, Scala AnyRef. Для этого вы помещаете это int внутрь объекта Integer, а затем передаете Integer.

Ответ 5

Целое число импортируется из java.lang.Integer и только для совместимости с Java. Поскольку это класс Java, конечно, он не может иметь метод под названием "<".

EDIT: вы можете уменьшить эту проблему, объявив неявное преобразование из Integer в Int.