2016-06-24 33 views
1

如果沒有顯式導入,可以從伴隨對象中獲取隱含條件嗎?隱式沒有顯式導入?

我有以下情況:

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

回答

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) 
+0

感謝。我過於專注於將隱含的內容添加到需要隱含的方法中。但是將它添加到構造函數在我的用例中很好用。 –