Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么隐式参数在进行隐式转换时不能显式传递?_Scala_Implicit Conversion_Implicit - Fatal编程技术网

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了。