Scala中隐式转换和隐式参数之间的关系是什么?
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
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中隐式转换和隐式参数之间的关系?”