Scala中的隐式转换和隐式参数之间是否存在关系?
在了解不同类型的暗示是什么或者它们的解析规则是什么时,我没有兴趣。
我只对这两个概念具有相同名称的原因感兴趣。
答案 0 :(得分:3)
从类型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
答案 1 :(得分:3)
AFAIK,除了共享相同的关键字之外,没有任何直接关系。
但它们可以以一种有趣的方式结合起来:
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]
implicit conversion
(花哨的名字,但实际上只是一个接受参数的隐式名称)可以接受implicit parameters
的行为非常像implicit val
(定义了给定的含义)。吊杆。