我有一个非常简单的示例,其中一个函数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
我会假设在这种情况下隐式类和隐式转换是可以互换的。我在这里缺少什么,为什么提供转换的两种方式不相同?
答案 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)
您会看到它起作用。