Int vs Integer: type mismatch, found: Int, required: String

Я набираю их для интерпретатора scala:

val a : Integer = 1;
val b : Integer = a + 1;

И я получаю сообщение:

<console>:5: error: type mismatch;
 found   : Int(1)
 required: String
       val b : Integer = a +1
                            ^

Почему? Как я могу это решить? На этот раз мне нужны целые числа из-за соображений совместимости Java.

Ответы

Ответ 1

Этот вопрос почти дублируется: Scala не может умножить java Doubles? - вы можете посмотреть мой ответ, так как идея схожа.

Как уже отмечалось Eastsun, ответ представляет собой неявное преобразование из java.lang.Integer (в основном поэтапного примитива int) в scala.Int, который является Scala способом представления простых чисел JVM.

implicit def javaToScalaInt(d: java.lang.Integer) = d.intValue

И была достигнута совместимость - код, который вы предоставили, должен скомпилировать просто отлично! И код, который использует scala.Int, где java.lang.Integer нужен, кажется, прекрасно работает из-за автобоксинга. Итак, следующие работы:

def foo(d: java.lang.Integer) = println(d)
val z: scala.Int = 1
foo(z)

Кроме того, как сказано в michaelkebe, не используйте тип Integer, который фактически сокращен для scala.Predef.Integer, поскольку он устарел и, скорее всего, будет удален в Scala 2.8.

EDIT: Ой... забыл ответить на вопрос почему. Вероятно, ошибка, с которой вы столкнулись, scala.Predef.Integer пыталась имитировать синтаксический сахар Java, где a + "my String" означает конкатенацию строк, a - это int. Поэтому метод + в типе scala.Predef.Integer выполняет только конкатенацию строк (ожидая тип String) и никакого добавления натурального целого.

- Флави Чипчиган

Ответ 2

Welcome to Scala version 2.7.3.final (Java HotSpot(TM) Client VM, Java 1.6.0_16).
Type in expressions to have them evaluated.
Type :help for more information.

scala> implicit def javaIntToScala(n: java.lang.Integer) = n.intValue

javaIntToScala: (java.lang.Integer)Int

scala> val a: java.lang.Integer = 1

a: java.lang.Integer = 1

scala> val b: java.lang.Integer = a + 1

b: java.lang.Integer = 2

Ответ 3

Прежде всего, вы должны использовать java.lang.Integer вместо Integer.

В настоящее время я не знаю, почему возникает ошибка.

a - это экземпляр java.lang.Integer, и этот тип не имеет метода с именем +. Кроме того, нет неявного преобразования в Int.

Чтобы решить эту проблему, вы можете попробовать следующее:

scala> val a: java.lang.Integer = 1
a: java.lang.Integer = 1

scala> val b: java.lang.Integer = a.intValue + 1
b: java.lang.Integer = 2