Scala 隐式而非显式导入?

Scala 隐式而非显式导入?,scala,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)(implici

在没有显式导入的情况下,是否可以从同伴对象获取隐式

我有以下情况:

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)
                                      ^

我想答案是,你不能

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)

谢谢我太专注于将隐式添加到我需要隐式的方法中。但在我的用例中,将其添加到构造函数中效果很好。