如何在scala中隐式转换一个隐式变量到另一个隐式变量

时间:2014-11-14 07:58:20

标签: scala

所有

我有这样的功能A和B:

def B(implicit t2: T2) = {
    ....
}

def A(implicit t1: T1) = {
    B()
}

T1和T2是不同的类型。 如何隐式将隐式变量t1转换为隐式变量t2?

最诚挚的问候, 凯文。

2 个答案:

答案 0 :(得分:2)

您可以定义一个隐式材料化器(一个不带参数的隐式def),返回类型T2,它需要一个类型为T1的隐式参数:

implicit def autoConvert(implicit t1: T1): T2 =
  // your conversion

然后,如果您在范围内具有此隐式,以及隐式T1,则可以使用该转换生成隐式T2

谨慎使用; - )

答案 1 :(得分:0)

我会直接转换价值:

def expectInt(implicit i: Int) = i * 10 

def expectString(implicit s: String) = { 
  expectInt(Integer.parseInt(s))       
}

expectsString("3") yields 30

如果无法更改方法调用:使用隐式转换:

// EXAMPLE CODE - WITHOUT EXCEPTION HANDLING!!
implicit def s2i(s: String) =   Integer.parseInt(s)          

def expectInt(implicit i: Int) = i * 10                      

def expectString(implicit s: String) = {                                              
  expectInt(s)                                               
}            

implicit val s = "2"                                
expectString yields 20

但请记住:多次隐式转换无法让您的代码易于理解