2014-02-24 70 views
2

我有一個特質EsperClassification定義如下:我該如何反思基於抽象類型變量的基本特徵中的Scalavro聯合類型?

trait EsperClassification { 
    import com.gensler.scalavro.util.Union 
    import scala.reflect.runtime.{currentMirror => m} 
    type EsperEvents 

    // what I want to do is this, but this fails: 
    val u = new Union[EsperEvents] 
    // so that I can do this: 
    u.memberTypes() foreach { t=> registerType(t.typeSymbol.Name,m.runtimeClass(t))} 

    private def registerType(name:String, clz: Class[_ <: Any]) = ... 
} 

這一特性被用作如下:

class EsperEventBus extends ActorEVentBus with EsperClassification { 
    type EsperEvents = union[Buy] #or [Sell] 

    … more stuff 
} 

失敗在聯盟實例化與Scala編譯器抱怨缺少類型標籤。

但是,如果我在混凝土EsperEventBus實例化的聯盟,它工作正常:

trait EsperClassification { 
    import com.gensler.scalavro.util.Union 
    import scala.reflect.runtime.{currentMirror => m} 
    type EsperEvents 
    def esperEventsUnion: Union[EsperEVents] // abstract! 

    // this works: 
    esperEventsUnion.memberTypes() foreach { 
     t=> registerType(t.typeSymbol.Name,m.runtimeClass(t))} 

    private def registerType(name:String, clz: Class[_ <: Any]) = ... 
} 

trait EsperEventBus extends ActorEventBus with EsperClassification { 
    type EsperEvents = union[Buy] #or [Sell] 

    def esperEventsUnion = new Union[EsperEvents] 
} 

我想知道的是是否和如何我可以實例化聯盟的特質本身?

感謝,

弗蘭克

回答

1

不幸的是,Union需要的類型的基本脫節的隱式TypeTag的分辨率。唯一的解決方法就像你所做的那樣:延遲實例化Union,直到這些證據可用於scalac。