2009-11-12 213 views
14

int是有件事我想错了下面的代码片段: -从字符串隐式转换到斯卡拉2.8

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警告
... \阶-2.8测试\ SRC \ Imp.scala
错误:错误:管线(4)的错误:类型MISM 1个错误和0个警告
信息完成ATCH;
发现:字符串
要求:?{VAL toInt:?}
注意,隐式转换是不适用的,因为它们是不明确的:
在种类型的目标进出口都方法string2Int(S:字符串)中等
和方法类型为(x:String)的对象Predef中的augmentString scala.collection.immutable.StringOps
可能是从String到?{val toInt:?}的转换函数
implicit def string2Int(s:String):Int = s.toInt

回答

8

还有已经是impli转换范围为,从scala.Predef。您无需声明自己的隐式转换即可将toInt方法添加到String。你有3种选择(我会去的最后一个!):

  • 更改方法名像asInt
  • Unimport在Predef
  • 转换不要打扰定义自己和使用而不是自带的Scala库

注意,斯卡拉只会让使用在范围内的隐式转换,如果它是独特捆绑toInt

+0

感谢您的快速回复,不幸的是,如果我注释掉我的隐含上面的内容,Predef隐含的内容并不会启动,它只在竞争对手出现时才出现在范围内;-)toInt选项很好,但我正在探索一个由String类型转换的方法,这个方法由一个类型参数确定,其中一个是String,即一个no-op。 – 2009-11-13 00:21:39

+0

明天我得用2.8来试试。我一直使用生产代码中的toInt转换(即使用2.7)! – 2009-11-13 00:23:08

23

发生了什么事情是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") 
    } 
} 
+0

感谢您的帮助,我没有意识到RichString已被取代。我仍然困惑的是,当我没有提供隐式的时候,通过augmentString的转换没有找到并且发生了类型错误。我试图不使用显式调用,因为要转换的类型是由我试图编写的实际方法中的类型参数提供的。 – 2009-11-13 15:59:18

+0

RichString尚未被取代,它仍然存在。不过,我不知道与AugmentedString有什么关系。问题是编译器不知道要调用哪个“.toInt”方法:AugmentedString上的那个或Int上的那个。 – 2009-11-13 19:02:11

+0

RichString仍然存在?我最好把这个删除键签出。 – extempore 2010-02-17 04:39:39

1

我想我有一个解决方法。

如果我从String参数创建了一个RichString,隐式转换通过使用我提供的隐式方法(适用于2.7.x和2.8)从RichString发生到Int。如果我删除了我的隐式,则会出现类型错误。

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进入了范围,当我提供了一个隐含的冲突和为何PREDEF一个没有接触到的范围时,我并没有为字符串提供一个诠释。我想关于从String到Int的隐式转换的问题仍然是打开的。