gpt4 book ai didi

scala - 为什么我们必须从伴随对象显式导入具有隐式参数的隐式转换?奇怪的。

转载 作者:行者123 更新时间:2023-12-04 20:42:59 24 4
gpt4 key购买 nike

让我们考虑一下这段代码:

class A
object A{
implicit def A2Int(implicit a:A)=1
implicit def A2String(a:A)="Hello"
}

object Run extends App{
implicit val a: A =new A

import A.A2Int
// without this import this code does not compile, why ?
// why is no import needed for A2String then ?

def iWantInt(implicit i:Int)=println(i)
def iWantString(implicit s:String)=println(s)

iWantInt
iWantString(a)
}

它运行并打印:
1
Hello

现在,如果我们注释掉这一行
import A.A2Int

然后我们得到一个编译错误:

enter image description here

注释掉这一行,为什么 Scala 找不到 A.A2String如果能找到 A.A2Int ?

如何解决这个问题?

谢谢阅读。

最佳答案

不同的是,当你做 iWantString(a) ,编译器从一些起点开始工作:您明确地传递 a ,编译器知道它的类型是 A .
鉴于 iWantString需要一个 String而不是 A ,编译器将从 A 搜索隐式转换至 String为了插入它并使调用成功。
隐式查找规则规定编译器必须在类 A 的伴生对象中查找(以及其他地方)。因为类型 A是转换的源类型。
这是它找到隐式转换 A2String 的地方.
你必须从中得到的是,这只是因为你传递了一个 A 的实例。编译器知道要查找到 A 的伴随对象的隐式转换.

当你刚刚做iWantInt ,编译器没有理由去查看 A ,所以它不会找到你的方法 A2Int (并且由于范围内没有其他方法/值提供类型 Int 的隐式值,编译失败)。

有关隐式查找规则的更多信息,请参阅
请参阅 http://www.scala-lang.org/docu/files/ScalaReference.pdf 处的 Scala 规范(第 7.2 章)。这是最相关的摘录:

The implicit scope of a type T consists of all companion modules (§5.4) of classes that are associated with the implicit parameter’s type.

关于scala - 为什么我们必须从伴随对象显式导入具有隐式参数的隐式转换?奇怪的。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22764272/

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