以下片段是否有问题: -
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 回答
发生的事情是Java没有在
String
上定义toInt
方法 . 在Scala中,定义该方法的是类StringOps
(Scala 2.8)或RichString
(Scala 2.7) .另一方面,在
Int
上也有一个方法toInt
(通过另一个隐含的,可能是?),因此编译器不知道是否要将字符串转换为StringOps
,通过定义的隐式或Int
,通过你自己的隐含 .要解决它,请显式调用隐式 .
有 already an implicit conversion in scope ,来自
scala.Predef
. 您无需声明自己的隐式转换,即可将toInt
方法添加到String
. 你有3个选择(我会选择最后一个!):将您的方法名称更改为
asInt
在
Predef
中取消导入转换不要打扰定义自己的,而是使用与scala库捆绑在一起的
toInt
请注意,如果scala是唯一的,则scala将仅使用范围内的隐式转换 .
我想我有一个解决方法 .
如果我从String参数创建RichString,则使用我提供的隐式方法从RichString到Int进行隐式转换(这适用于2.7.x和2.8) . 如果我删除我的隐含我得到一个类型错误 .
我仍然感到困惑的是,当我提供一个隐含的时候为什么两个implicits进入范围并发生冲突,以及为什么当我没有为String提供一个时,Predef没有进入范围 . 我想有关从String到Int的隐式转换的问题仍然存在 .