Scala中隐式转换和隐式参数之间的关系是什么?

Scala中隐式转换和隐式参数之间的关系是什么?,scala,implicit-conversion,Scala,Implicit Conversion,Scala中的隐式转换和隐式参数之间有关系吗 我从来没有兴趣知道什么是不同类型的隐式含义,或者它们的解析规则是什么 我只对这两个概念为什么同名感兴趣。从类型A到类型B的隐式转换是一个隐式函数A=>B 隐式def使隐式函数可用: // two types class A class B // implicit conversion from A to B implicit def aToB(a: A): B = { println("aToB"); new B } // we now ha

Scala中的隐式转换和隐式参数之间有关系吗

我从来没有兴趣知道什么是不同类型的隐式含义,或者它们的解析规则是什么

我只对这两个概念为什么同名感兴趣。

从类型
A
到类型
B
的隐式转换是一个隐式函数
A=>B

隐式def使隐式函数可用:

// two types
class A
class B
// implicit conversion from A to B
implicit def aToB(a: A): B = {
  println("aToB");
  new B
}
// we now have a Function[A, B] aka A => B in the implicit scope
val f = implicitly[A => B]
f(new A)
> aToB
res1: B = B@51931956
隐式函数支持隐式转换:

class IntExtension(x: Int) { def isPositive = x > 0 }
implicit val intToIntExtensions: Int => IntExtension = x => new IntExtension(x)
> 1.isPositive
res2: Boolean = true

好吧,除了它们共享同一个关键字外,没有任何直接关系

但它们可以以一种有趣的方式组合在一起,如:

class Foo
class Bar
class FooBar(foo: Foo, bar: Bar)

implicit val foo = new Foo
implicit val bar = new Bar

implicit def fooBar(implicit foo: Foo, bar: Bar): FooBar = new FooBar(foo, bar)

implicitly[FooBar]

隐式转换
(别致的名称,但实际上只不过是一个接受参数的隐式转换)可以接受
隐式参数
,使其与
隐式val
(定义了隐式)非常相似。砰。

让我看看我是否理解正确。隐式地[A=>B]将返回对aToB的引用。您可以给这个引用一个新的a,它将返回一个新的B。隐式val的功能与隐式def相同。但是对于具有隐式参数的函数,比如foo(int:int)(隐式bar:bar)呢?这回答了问题:@GiovanniCaporaletti这是如何回答这个问题的?@MichaelLafayette它详细解释了隐式转换和隐式参数是什么,以及它们是如何由编译器管理的。我真的不知道还有什么可以补充的。它还使用视图边界和上下文边界将所有内容置于上下文中,这是一个全面的答案。@MichaelLafayette隐式参数需要隐式值或隐式转换才能从a转换为B,其中B是函数所需的隐式参数。我认为这个答案在这方面解释得很好。@GiovanniCaporaletti很抱歉,我被大量的文本分散了注意力,这些文本涉及到人们将在何处搜索隐含内容。是否可以将与“Scala在何处查找隐式”无关的信息转移到单独的问题。详细的例子只关注“Scala中隐式转换和隐式参数之间的关系?”