在我的Akka actor基类中通过擦除消除了类型模式

时间:2017-01-27 15:33:23

标签: scala akka

abstract class BaseActor[U: TaskUnit](master: ActorRef) extends Actor with ActorLogging {

    def receive = {
        ..
        ..

        case taskUnit: U => ...

    }

    def performTask(task: U): Future[_]
}

我的TaskUnit看起来像:

trait TaskUnit {
    def status(status: String): TaskResponse[_] 
}

我收到1个错误和1个警告,我需要一些建议。

  1. 我收到一条警告,说TaskUnit不接受类型参数(此错误在抽象类定义行上)

  2. 警告说抽象类型模式U未被选中,因为它是通过擦除消除的(这是针对案例taskUnit:U行)

  3. 我目前的设计有什么问题?

1 个答案:

答案 0 :(得分:4)

你收到错误的原因很简单。你在写:

abstract class X[U: Y]

但你可能意味着这样的事情:

abstract class X[U <: Y]

这两个定义之间的差异非常显着。第二个信号表明,类型参数U应该是Y的子类型(包括Y)。但第一个是不同的东西。它被翻译成以下内容:

abstract class X[U](implicit ev: Y[U])

引入此语法是为了在scala中使用类型较少的样板类。我想你现在可以看到你的错误来源。编译器期望TaskUnit只有一个类型参数的类型:

TaskUnit[T] {
  ...
}

但它显然没有这样的形状。