首页 文章

在scala 2.8中从String到Int的隐式转换

提问于
浏览
14

以下片段是否有问题: -

object Imp {
  implicit def string2Int(s: String): Int = s.toInt

  def f(i: Int) = i

  def main(args: Array[String]) {
    val n: Int = f("666")
  }
}

我从2.8编译器中得到以下内容: -

信息:编译完成,出现1个错误和0个警告
信息:1错误
信息:0警告
... \斯卡拉-2.8测试的\ src \ Imp.scala
错误:错误:第(4)行错误:类型不匹配;
发现:字符串
要求:?{val toInt:?}
请注意,隐式转换不适用,因为它们不明确:
对象Imp中的方法string2Int类型(s:String)Int
和方法augmentString in object Predef of type(x:String)scala.collection.immutable.StringOps
可能的转换函数从String到?{val toInt:?}
implicit def string2Int(s:String):Int = s.toInt

3 回答

  • 1

    发生的事情是Java没有在 String 上定义 toInt 方法 . 在Scala中,定义该方法的是类 StringOps (Scala 2.8)或 RichString (Scala 2.7) .

    另一方面,在 Int 上也有一个方法 toInt (通过另一个隐含的,可能是?),因此编译器不知道是否要将字符串转换为 StringOps ,通过定义的隐式或 Int ,通过你自己的隐含 .

    要解决它,请显式调用隐式 .

    object Imp {
      implicit def string2Int(s: String): Int = augmentString(s).toInt
    
      def f(i: Int) = i
    
      def main(args: Array[String]) {
        val n: Int = f("666")
      }
    }
    
  • 8

    already an implicit conversion in scope ,来自 scala.Predef . 您无需声明自己的隐式转换,即可将 toInt 方法添加到 String . 你有3个选择(我会选择最后一个!):

    • 将您的方法名称更改为 asInt

    • Predef 中取消导入转换

    • 不要打扰定义自己的,而是使用与scala库捆绑在一起的 toInt

    请注意,如果scala是唯一的,则scala将仅使用范围内的隐式转换 .

  • 23

    我想我有一个解决方法 .

    如果我从String参数创建RichString,则使用我提供的隐式方法从RichString到Int进行隐式转换(这适用于2.7.x和2.8) . 如果我删除我的隐含我得到一个类型错误 .

    object Imp {
    
      implicit def string2Int(rs: RichString): Int = rs.toInt
    
      def f(i: Int) = i
    
      def main(args: Array[String]) {
        val n: Int = f(new RichString("666"))
    
        println(n)
      }
    }
    

    我仍然感到困惑的是,当我提供一个隐含的时候为什么两个implicits进入范围并发生冲突,以及为什么当我没有为String提供一个时,Predef没有进入范围 . 我想有关从String到Int的隐式转换的问题仍然存在 .

相关问题