作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在scala中编写了以下隐式转换:
implicit def strToInt2(str: String):Int = {
str.toInt
}
<console>:9: error: type mismatch;
found : str.type (with underlying type String)
required: ?{val toInt: ?}
Note that implicit conversions are not applicable because they are ambiguous:
both method augmentString in object Predef of type (x: String)scala.collection.
immutable.StringOps
and method toi in object $iw of type (str: String)Int
are possible conversion functions from str.type to ?{val toInt: ?}
str.toInt
^
implicit def strToInt2(str: String) = {
str.toInt
}
最佳答案
好的,让我们从头开始,为什么在第一种情况下会失败:
您尝试定义一个隐式方法,该方法将String
转换为Int
,并调用toInt
。
不幸的是,toInt
不是String
类的一部分。因此,编译器需要找到一个隐式方法以将str
转换为具有toInt:Int
方法的内容。
幸运的是,Predef.augmentString
将String
转换为StringOps
,它具有这种方法。
但是Int
类型也具有这样的方法,并且您可以定义返回类型,因此可以递归地调用方法strToInt2
,并且由于该方法是隐式的,因此可以使用toInt:Int
函数将其转换为某些内容。
编译器不知道要使用哪种隐式方法(在您和Predef.augmentString
之间,并引发错误。
在第二种情况下,由于您省略了返回类型,所以strToInt2
函数不能递归,并且不再有两个候选者可以转换String
。
但是,如果在此定义之后尝试:"2".toInt
,错误又回来了:现在,当拥有toInt:Int
时,您有两种方法可以使用String
函数获得某些东西。
关于scala - 为什么这种类型的隐式转换是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9060824/
我是一名优秀的程序员,十分优秀!