Scala 为什么隐式参数在进行隐式转换时不能显式传递?
为什么Scala 为什么隐式参数在进行隐式转换时不能显式传递?,scala,implicit-conversion,implicit,Scala,Implicit Conversion,Implicit,为什么iWantInt(a)不编译而iWantInt(b)和-更令人惊讶的是iWantInt编译 我如何理解这种行为 既然我可以隐式传递,为什么我不能显式地将a传递给iWantInt iWantA与iwantt有何不同?为什么它不以同样的方式工作 这种行为是否有记录/解释 如果Scala接受iwantt(a)会导致什么样的问题?为什么是禁止的 class A class B object Run extends App { implicit val a = new A implici
iWantInt(a)
不编译而iWantInt(b)
和-更令人惊讶的是iWantInt
编译
我如何理解这种行为
既然我可以隐式传递,为什么我不能显式地将a
传递给iWantInt
iWantA
与iwantt
有何不同?为什么它不以同样的方式工作
这种行为是否有记录/解释
如果Scala接受iwantt(a)会导致什么样的问题?为什么是禁止的
class A
class B
object Run extends App {
implicit val a = new A
implicit val b = new B
implicit def A2Int(implicit a:A)=1
implicit def B2Int(b:B)=2
def iWantA(implicit a:A)=println("A")
def iWantInt(implicit i: Int) = println(i)
iWantInt(b) // prints 2
iWantInt // prints 1
// iWantInt(a) // when uncommented this line does not compile, why ?
iWantA // prints A
iWantA(a) // prints A
}
与定义隐式转换不同,
A2Int
的作用类似于已声明为隐式的值,如示例中的implicit val a
,唯一的区别是必须在作用域中发现隐式a
。这就是允许在没有显式参数的情况下编译iWantInt
——编译器将A2Int
作为隐式Int
,然后将a
作为A2Int
的隐式a
要使函数符合隐式转换的条件,它必须采用单个非隐式参数B2Int
采用单个参数(b:b)
,因此满足要求。这允许iwantt(b)
编译A2Int
具有(隐式a:a)
但由于此参数是隐式的A2Int
不满足要求,因此IWANTIT(a)
不会编译,除非添加了类似隐式定义A2Int2(a:a)=1的行。如果使用-feature
标志运行scalac
(至少在2.11中会建议使用该标志),它将显示B2Int
和A2Int2
的警告,说明隐式转换应该通过使scala.language.implicitConversions可见来显式启用。它不会显示关于A2Int
的警告,表明编译器不会将其视为隐式转换
这是Scala的最终定义。请参阅第7章“隐式参数和视图”,了解这些特定功能的行为规范。谢谢您的回答!请您澄清一下“隐式转换要求只有一个非隐式参数”是什么意思?隐式参数where?那么您的意思是隐式def A2Int(隐式a:a)不算作隐式转换,因为它的参数是隐式的?是的,这是正确的。我编辑了第二段以使它更清楚。非常感谢!我想是时候真正了解SLS了。