我将这些输入到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。
答案 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"
表示字符串连接,a
是int
。因此,+
类型中的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
。
目前我不知道错误发生的原因。
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