假设我有这些课程:
case class A()
case class B()
case class C(a: A, b: B)
Run Code Online (Sandbox Code Playgroud)
和这些变量:
val a = A()
val b = B()
Run Code Online (Sandbox Code Playgroud)
有没有办法C隐式地获取一个实例而没有制作a和b隐式的val?即如果我有一个方法期望C:
def foo(c: C)
Run Code Online (Sandbox Code Playgroud)
该case class A表示法已弃用.你必须使用case class A(),否则分配A到val a将导致a参照案例类的同伴对象A,其幕后产生.
我的理解是你想要a引用case类的实例,而不是伴随对象.
如果是这样,您所要求的是可能的 - a并且b不必是隐式的,但您必须在范围中添加新的隐式方法:
implicit def obtainC = new C(a, b)
Run Code Online (Sandbox Code Playgroud)
然后,您必须将implicit修改器c放在方法中foo:
def foo(implicit c: C)
Run Code Online (Sandbox Code Playgroud)
完整课程:
scala> case class A()
defined class A
scala> case class B()
defined class B
scala> case class C(a: A, b: B)
defined class C
scala> val a = A()
a: A = A()
scala> val b = B()
b: B = B()
scala> implicit def obtainC = new C(a, b)
obtainC: C
scala> def foo(implicit c: C) = {}
foo: (implicit c: C)Unit
scala> foo
Run Code Online (Sandbox Code Playgroud)