【问题标题】:Int vs Integer: type mismatch, found: Int, required: StringInt vs Integer:类型不匹配,找到:Int,必需:String
【发布时间】:2012-12-06 01:02:34
【问题描述】:

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    这个问题几乎是重复的:Scala can't multiply java Doubles? - 你也可以看看my answer,因为想法是相似的。

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

    implicit def javaToScalaInt(d: java.lang.Integer) = d.intValue
    

    并且已经实现了互操作性 - 您提供的代码片段应该可以正常编译!由于自动装箱,在需要 java.lang.Integer 的地方使用 scala.Int 的代码似乎工作得很好。所以以下工作:

    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 类型)并且没有自然整数加法。

    -- 弗拉维乌·西普西根

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

        首先你应该使用java.lang.Integer而不是Integer

        目前我不知道为什么会发生错误。

        ajava.lang.Integer 的一个实例,并且该类型没有名为+ 的方法。此外,没有隐式转换为Int

        要解决这个问题,你可以试试这个:

        scala> val a: java.lang.Integer = 1 一个:java.lang.Integer = 1 scala> val b: java.lang.Integer = a.intValue + 1 b: java.lang.Integer = 2

        【讨论】:

          猜你喜欢
          • 2015-04-03
          • 1970-01-01
          • 2015-04-11
          • 1970-01-01
          • 2011-12-19
          • 1970-01-01
          • 1970-01-01
          • 2017-05-03
          • 1970-01-01
          相关资源
          最近更新 更多