我正在努力想出一个类型安全的消息传递系统。现在,我想出的最好的是:
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
。有没有办法让我参考我在类型参数中定义的类型,所以我可以使用我想要的语法?
类型系统显然可以做我想要的事情,我只是想使用我喜欢的语法。
- 编辑 -
我想我找到了解决方案。
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 :(得分: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
是一种只有一个值的类型:this
。 this
不存在于特征体之外,因此不能在类型参数中使用。如果你真的需要引用特征混合的类型,你需要F-bounded polymorphism。