首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala -隐式转换为隐式参数

Scala -隐式转换为隐式参数
EN

Stack Overflow用户
提问于 2016-02-29 13:57:39
回答 1查看 1.1K关注 0票数 2

我有一个类A,它还定义了对B的隐式转换。

代码语言:javascript
复制
case class A(number:Int) 
case class B(number:Int, tag:String)
implicit def  AtoB(a:A) = B(a.number,"Hello World")

我还有一个检索A的函数,并希望调用一个以参数隐式B为参数的函数。

代码语言:javascript
复制
def hello()(implicit b:B)= {....}
def execute = {
    implicit val a:A  = ....
    hello()  //doesnt compile missing implicit parameter b
}

在不显式定义B的情况下,如何才能使这些代码工作呢?i.e

代码语言:javascript
复制
val b:B = a
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-29 14:32:05

定义如下函数:

代码语言:javascript
复制
implicit def implicitBfromA(implicit a: A): B = a

并在调用hello时将其放在作用域中,或者将其放入B的伴生对象中。

此函数不是隐式转换。它指出,如果在作用域中已经存在可用类型B的隐式值,则存在类型A可用的隐式值。

注意,要使它正常工作,应该在文件中的AtoB之后定义它,或者AtoB应该具有显式指定的返回类型:implicit def AtoB(a:A): B = B(a.number, "Hello World"),或者您应该在它的主体:implicit def implicitBfromA(implicit a: A): B = AtoB(a)中显式调用AtoB

一个完整的工作实例:

代码语言:javascript
复制
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()
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35701451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档