当假定不是等效的隐式类不存在时,应用隐式转换

时间:2019-06-20 15:20:43

标签: scala implicit-conversion implicit

我有一个非常简单的示例,其中一个函数foo()接受类型为A的隐式参数,试图调用另一个函数bar(),后者接受类型为{ {1}}。在我遇到这个问题的项目中,B包含B的功能的一部分,因此我想提供一个{em> {im1}隐式转换 A,以使本例中的情况变得无缝。

使用隐式转换A来实现此功能按预期进行。 B 2.13.0接受以下代码:

B.implicitConversion()

奇怪的是,使用隐式类 scalac来实现转换是行不通的(通过删除trait A trait B object B { // implicit class ImplicitClass(value: A) extends B implicit def implicitConversion(implicit se: A) = ??? } class Test { def foo()(implicit a: A) = bar() def bar()(implicit b: B) = ??? } 的定义并添加ImplicitClass的定义) 。该代码被implicitConversion()拒绝:

ImplicitClass

我会假设在这种情况下隐式类和隐式转换是可以互换的。我在这里缺少什么,为什么提供转换的两种方式不相同?

1 个答案:

答案 0 :(得分:2)

ImplicitClass等同于

class ImplicitClass(value: A) extends B

implicit def ImplicitClass(value: A): ImplicitClass

您可以看到不同之处:与您的value: A不同,此隐式转换将def implicitConversion作为显式参数。如果您更改为

def foo()(implicit a: A) = bar()(a)

您会看到它起作用。