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

时间:2016-04-09 06:15:40

标签: scala implicit-conversion

Scala中的隐式转换和隐式参数之间是否存在关系?

在了解不同类型的暗示是什么或者它们的解析规则是什么时,我没有兴趣。

我只对这两个概念具有相同名称的原因感兴趣。

2 个答案:

答案 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(定义了给定的含义)。吊杆。