Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 指类型参数中定义的类型_Scala_Generics_Types - Fatal编程技术网

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;
}