Scala - 隐式转换为隐式参数

Scala - 隐式转换为隐式参数

问题描述:

我有一个类A,它也定义了一个隐式转换为BScala - 隐式转换为隐式参数

case class A(number:Int) 
case class B(number:Int, tag:String) 
implicit def AtoB(a:A) = B(a.number,"Hello World") 

我也有检索A,想调用一个函数,它作为参数隐B功能:

def hello()(implicit b:B)= {....} 
def execute = { 
    implicit val a:A = .... 
    hello() //doesnt compile missing implicit parameter b 
} 

我如何获得此代码没有显式定义B工作?即

val b:B = a 
+1

你能做的唯一的事情就是'你好()(A)'或创建另一个功能。设计中的scala不允许暗含“连锁”。 – yw3410

+0

这不完全正确。如果您调用的方法的隐式参数的类型与给予您当前所在方法的隐式参数的类型相同,它将被传递。 –

定义一个函数是这样的:

implicit def implicitBfromA(implicit a: A): B = a 

,要么有它的范围,当你调用hello,或放入的B同伴对象。

此函数不是一个隐式转换。它指出,如果在作用域中已经有一个类型为A的隐式值,那么可以使用B类型的隐式值。

需要注意的是它为它工作,它应该要么AtoB在文件中之后定义,或AtoB应该有一个明确指定的返回类型:implicit def AtoB(a:A): B = B(a.number, "Hello World"),或者你应该明确地调用AtoB在它的身上:implicit def implicitBfromA(implicit a: A): B = AtoB(a)

一个完整的工作示例:

case class A(number: Int) 

case class B(number: Int, tag: String) 
object B { 
    implicit def implicitB(implicit a: A): B = a 
} 

implicit def AtoB(a:A): B = B(a.number, "Hello World") 

def hello()(implicit b: B) = b.number.toString + b.tag 

def execute = { 
    implicit val a: A = A(10) 
    hello() 
}