2014-06-19 121 views
1

我試圖想出一個類型安全的消息傳遞系統。現在,我已經拿出最好的是這樣的:參考類型參數中定義的類型

trait Component 
trait Message[From <: Component, -To <: Handler[From]] 

trait Handler[From <: Component]{ 
    type MessageType <: Message[From, this.type] 

    def handle(message: MessageType): Unit; 
} 

我想更多的東西是這樣的:

trait Component 
trait Message[From <: Component, -To <: Handler[From]] 

trait Handler[From <: Component, MessageType <: Message[From, this.type]]{ 

    def handle(message: MessageType): Unit; 
} 

但編譯器抱怨的類型參數使用this.type。有沒有辦法讓我參考我在類型參數中定義的類型,以便我可以使用我想要的語法?

類型系統顯然可以做我想做的事我只是喜歡它使用我喜歡的語法。

- EDIT--

我想我找到了解決方案。

trait Component 
trait Message[From <: Component, 
       To <: Handler[From, To, MessageType], 
       MessageType <: Message[From, To, MessageType]] 

trait Handler[From <: Component, 
       To <: Handler[From, To, MessageType], 
       MessageType <: Message[From, To, MessageType]]{ 

    def handle(message: MessageType): Unit; 
} 

在類型參數中稍微冗長一些,但效果很好。

回答

0

我不認爲你需要MessageType在類型參數來完成你想要的。取而代之的是使MessageType等於Message[From, this.type]

trait Handler[From <: Component] { 
    type MessageType = Message[From, this.type] 

    def handle(message: MessageType): Unit; 
} 

考慮在其第一個參數中進行消息協變。

請注意,this.type確實不是指的是您正在定義的類型。 this.type是隻有一個值的類型:thisthis不存在特徵體外,因此不能用在類型參數中。如果您確實需要參考特徵將混入的類型,則需要F-bounded polymorphism

+0

所以這個解決方案的問題是,你不能使用Message [From,this.type]的子類型作爲參數來處理使其對模式匹配更加有用。 – Meshelton

+0

@Meshelton我不明白你的意思。你絕對可以將一個子類型傳遞給'handle',方法總是在它們的參數中是不相容的。 – wingedsubmariner

+0

你可以傳遞一個子類型,但是你不能像這樣'def handle(message:SubtypeOfMessageType):Unit'聲明方法,你會得到一個合理的編譯器錯誤。 – Meshelton