2017-01-27 53 views
0
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線)

我目前的設計有什麼問題?

回答

4

那麼你收到錯誤的原因很簡單。你寫:

abstract class X[U: Y] 

但你可能是指這樣的事:這兩個定義之間

abstract class X[U <: Y] 

差異是相當顯著。第二個信號,那個類型參數U應該是Y的子類型(包括Y)。但第一個是不同的。它被翻譯成如下:

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

這個語法是爲了使階式類的使用較少的樣板介紹。我認爲你現在可以看到你的錯誤的來源。編譯器希望TaskUnit類型只有一個類型參數:

TaskUnit[T] { 
    ... 
} 

但它顯然沒有這樣的形狀。