【问题标题】:Type pattern eliminated by erasure in my Akka actor base class在我的 Akka actor 基类中通过擦除消除了类型模式
【发布时间】:2017-01-27 15:33:23
【问题描述】:
abstract class BaseActor[U: TaskUnit](master: ActorRef) extends Actor with ActorLogging {

    def receive = {
        ..
        ..

        case taskUnit: U => ...

    }

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

我的任务单元看起来像:

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

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

  1. 我收到一条警告说 TaskUnit 不采用类型参数(此错误位于抽象类定义行)

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

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

【问题讨论】:

    标签: scala akka


    【解决方案1】:

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

    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] {
      ...
    }
    

    但它显然没有这种形状。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-23
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多