诠释VS整数:类型不匹配,发现:诠释,需要:字符串
我键入这些是Scala解释:诠释VS整数:类型不匹配,发现:诠释,需要:字符串
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互操作性的原因。
这个问题几乎是一个重复: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
速记,因为它已被弃用,最有可能会在斯卡拉2.8被删除。
编辑:糟糕...忘了回答原因。您得到的错误可能是scala.Predef.Integer
试图模仿Java的语法糖,其中a + "my String"
表示字符串连接,a
是int
。因此,scala.Predef.Integer
类型中的+
方法只执行字符串连接(期望String
类型)并且没有自然整数加法。
- Flaviu Cipcigan
首先您应该使用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
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