隐含没有明确的进口?

时间:2016-06-24 17:46:02

标签: scala

是否可以在没有显式导入的情况下从伴随对象中获取隐含?

我有以下情况:

trait Foo[A] {
  def foo(f: A): String
}

case class Bar(name: String)

object Bar {
  implicit object FooBar extends Foo[Bar] {
    def foo(f: Bar) = f.name
  }
}

class TestImplicits[T] {
  def sayFoo(t: T)(implicit ev: Foo[T]) = ev.foo(t)

  def sayFooIndirect(t: T) = sayFoo(t)
}

我想要实现的是能够实例化TestImplicits并调用sayFooIndirect方法,而无需将隐式隧道传递给sayFoo方法。

val b = new Bar("test")
val t = new TestImplicit[Bar]
t.sayFooIndirect(b)

但是代码没有编译:

could not find implicit value for parameter ev: Foo[T]
     def sayFooIndirect(t: T) = sayFoo(t)
                                      ^

1 个答案:

答案 0 :(得分:2)

我认为答案是,你不能

class TestImplicits[T] {
  def sayFoo(t: T)(implicit ev: Foo[T]) = ev.foo(t)
  def sayFooIndirect(t: T) = sayFoo(t)
}

sayFoo会使用参数ev,当您明确或隐含地调用时,必须提供

sayFooIndirect的正文中,没有类型Foo[T]的隐式对象可用。要使其可用,要么在任何地方隐式传递它,要么使用其他方式将其放在范围内。由于您的类已使用T类型修复,因此您可以在构造函数中使用隐式Foo[T]

class TestImplicits[T](implicit ev: Foo[T]) {
  def sayFoo(t: T) = ev.foo(t)
  def sayFooIndirect(t: T) = sayFoo(t)
}

使用以下方法将起作用:

val b = new Bar("test")
val t = new TestImplicits[Bar]
t.sayFooIndirect(b)