2014-03-06 212 views
2

我有以下代碼女巫將是隱含對象的基:麻煩與斯卡拉隱含參數

trait Foo[-T] { 
    def hello(obj: T) 
} 

trait Model extends Serializable { 
    def bar()(implicit foo: Foo[Model]) = { foo.hello(this) } 
} 

class SerializableFoo[T <: Serializable] extends Foo[T] { 
    def hello(obj: T) { println("hello from SerializableFoo") } 
} 

class FOSModelFoo[T <: Model] extends Foo[T] { 
    def hello(obj: T) { println("hello from FOSModelFoo") } 
} 

object Foo { 
    implicit object DefaultFoo extends SerializableFoo[Model] 
} 

class FOSModel extends Model { 
    implicit object InnerFoo extends FOSModelFoo 
} 

當我請一個FOSModel實例吧(),我期待將要使用的FOSModelFoo,但它發生它調用SerializableFoo。

我錯過了什麼?

回答

2

問題1:implicit object InnerFoo可在(或導入)中定義的範圍內作爲隱含的使用。

object Foo { 
    implicit object DefaultFoo extends SerializableFoo[Model] 
    implicit object InnerFoo extends FOSModelFoo[FOSModel] 
} 

問題2:如果您的InnerFoo是隨處可見,它應該在object Fooobject FOSModel定義Implicits取決於靜態類型,而不是在運行時類型,因此它不會不管你用什麼情況下,如果編譯器只知道它是一個Model。例如。

val fosModel: Model = new FOSModel 

問題3:既然你問了Foo[Model]而不是Foo[FOSModel]DefaultFoo是適合的只有一個。

我不能確切地告訴你想要什麼,但這看起來像一個不完整的「奇怪的循環模板模式」。它可能類似於

trait Model[T <: Model[T]] extends Serializable { 
    def bar()(implicit foo: Foo[T]) = { foo.hello(this) } 
} 

class FOSModel extends Model[FOSModel] 

object FOSModel { 
    implicit object InnerFoo extends FOSModelFoo 
} 
... 
+0

我按照你的說法試過了,但它仍然是一樣的。我想要做的是基本上有一個默認隱式Foo(SerializableFoo)與模型(模型trait)一起使用,並且對於特定的模型實例(FOSModel)具有Foo(FOSModelFoo)的特定實例。 – halfwarp

+0

您是否將問題2考慮在內?即如果兩種情況下的_static_類型都是Model,則無法獲得所需的結果。如果是,請使用更新的代碼編輯問題。 –