gpt4 book ai didi

scala - 为什么这种类型的隐式转换是非法的?

转载 作者:行者123 更新时间:2023-12-03 14:10:07 25 4
gpt4 key购买 nike

我在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.augmentStringString转换为StringOps,它具有这种方法。
但是Int类型也具有这样的方法,并且您可以定义返回类型,因此可以递归地调用方法strToInt2,并且由于该方法是隐式的,因此可以使用toInt:Int函数将其转换为某些内容。
编译器不知道要使用哪种隐式方法(在您和Predef.augmentString之间,并引发错误。


在第二种情况下,由于您省略了返回类型,所以strToInt2函数不能递归,并且不再有两个候选者可以转换String

但是,如果在此定义之后尝试:"2".toInt,错误又回来了:现在,当拥有toInt:Int时,您有两种方法可以使用String函数获得某些东西。

关于scala - 为什么这种类型的隐式转换是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9060824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com