参考类型参数中定义的类型

时间:2014-06-19 17:29:45

标签: 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, 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;
}

在类型参数中有点冗长,但效果很好。

1 个答案:

答案 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是一种只有一个值的类型:thisthis不存在于特征体之外,因此不能在类型参数中使用。如果你真的需要引用特征混合的类型,你需要F-bounded polymorphism

相关问题