Scala 指类型参数中定义的类型
我正在尝试设计一个类型安全的消息传递系统。现在我想到的最好的办法是:Scala 指类型参数中定义的类型,scala,generics,types,Scala,Generics,Types,我正在尝试设计一个类型安全的消息传递系统。现在我想到的最好的办法是: 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]{
type MessageType <: Message[From, this.type]
def handle(message: MessageType): Unit;
}
类型参数更详细一些,但效果很好。我认为您不需要在类型参数中使用MessageType来实现所需的功能。改为使MessageType等于Message[From,this.type]
考虑在第一个参数中使消息协变
请注意,this.type不引用您正在定义的类型。this.type是一个只有一个值的类型:this。它不存在于trait主体之外,因此不能在类型参数中使用。如果您真的需要引用该特征将被混合到的类型,您需要。因此,此解决方案的问题在于,您不能使用Message[From,this.type]的子类型作为参数来处理,这使得它在模式匹配中的用处大大降低。@Meshelton我不明白您的意思。您完全可以传递要处理的子类型,方法的参数总是相反的。您可以传递子类型,但不能像下面这样声明方法def handlemessage:SUBTEOFMESSAGETYPE:Unit。如果您得到一个有意义的编译器错误。
trait Component
trait Message[From <: Component, -To <: Handler[From]]
trait Handler[From <: Component, MessageType <: Message[From, this.type]]{
def handle(message: MessageType): Unit;
}
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;
}
trait Handler[From <: Component] {
type MessageType = Message[From, this.type]
def handle(message: MessageType): Unit;
}