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;
}
在類型參數中稍微冗長一些,但效果很好。
所以這個解決方案的問題是,你不能使用Message [From,this.type]的子類型作爲參數來處理使其對模式匹配更加有用。 – Meshelton
@Meshelton我不明白你的意思。你絕對可以將一個子類型傳遞給'handle',方法總是在它們的參數中是不相容的。 – wingedsubmariner
你可以傳遞一個子類型,但是你不能像這樣'def handle(message:SubtypeOfMessageType):Unit'聲明方法,你會得到一個合理的編譯器錯誤。 – Meshelton