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

时间:2009-10-14 13:42:28

标签: scala

我将这些输入到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互操作性原因,我需要Integers。

3 个答案:

答案 0 :(得分:19)

这个问题几乎与以下内容重复:Scala can't multiply java Doubles? - 您也可以查看my answer,因为这个想法很相似。

正如Eastsun已经提示的那样,答案是从java.lang.Integer(基本上是盒装int原语)到scala.Int隐式转换 ,这是表示JVM原始整数的Scala方式。

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中删除。

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

- Flaviu Cipcigan

答案 1 :(得分: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

答案 2 :(得分:0)

首先,您应该使用java.lang.Integer代替Integer

目前我不知道错误发生的原因。

ajava.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