2009-10-14 12 views
14

я печатаю этот переводчик лестницу:Int против Integer: несоответствие типов, найдено: Int, требуется: String

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.

ответ

19

Этот вопрос почти дубликат: Scala can't multiply java Doubles? - вы можете посмотреть на my answer, а также, как идея аналогична.

В Eastsun уже намекает, ответ является неявного преобразования из java.lang.Integer (в основном в штучном упаковке int примитивные) к scala.Int, который является Скала способом представления 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) и не добавляя натуральное целое число.

- Flaviu Cipcigan

0

Прежде всего, вы должны использовать 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 
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 
Смежные вопросы