Int vs Integer:类型不匹配,找到:Int,required:String

pcj*_*zer 14 scala

我将这些输入到scala解释器:

val a : Integer = 1;
val b : Integer = a + 1;
Run Code Online (Sandbox Code Playgroud)

我收到的消息是:

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

为什么?我怎么解决这个问题?这次我需要整数,因为Java互操作性的原因.

Fla*_*gan 19

这个问题几乎是重复的:Scala不能乘以java双打?- 你也可以看看我的答案,因为这个想法很相似.

正如Eastsun已经暗示的那样,答案是从(基本上是盒装基元)到a 的隐式转换,这是表示JVM原始整数的Scala方式.java.lang.Integerintscala.Int

implicit def javaToScalaInt(d: java.lang.Integer) = d.intValue
Run Code Online (Sandbox Code Playgroud)

并且已经实现了互操作性 - 你提供的代码剪断应该编译得很好!由于自动装箱,使用所需scala.Int位置的代码java.lang.Integer似乎工作得很好.以下是有效的:

def foo(d: java.lang.Integer) = println(d)
val z: scala.Int = 1
foo(z)
Run Code Online (Sandbox Code Playgroud)

此外,正如michaelkebe所说,不要使用Integer类型 - 这实际上是简写,scala.Predef.Integer因为它已被弃用,并且很可能将在Scala 2.8中删除.

编辑:糟糕...忘了回答原因.你得到的错误可能是scala.Predef.Integer试图模仿Java的语法糖,这a + "my String"意味着字符串连接,a是一个int.因此,类型中的+方法scala.Predef.Integer仅执行字符串连接(期望String类型)并且不添加自然整数.

- Flaviu Cipcigan