2017-01-27 1 views
0
abstract class BaseActor[U: TaskUnit](master: ActorRef) extends Actor with ActorLogging { 

    def receive = { 
     .. 
     .. 

     case taskUnit: U => ... 

    } 

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

Mein TaskUnit wie folgt aussieht:Typ Muster durch Löschen in meine Akka Schauspieler Basisklasse eliminiert

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

Ich erhalte 1 Fehler und 1 Warnung, die ich einige Ratschläge benötigen.

  1. Ich erhalte eine Warnung sagen TaskUnit nicht Typparameter nimmt (dieser Fehler auf die abstrakte Klassendefinition Zeile ist)

  2. Warnung der abstrakten Typ Muster sagen U nicht aktiviert ist, da sie durch beseitigt Löschen (dies ist für den Fall taskUnit: U Linie)

Was ist das Problem mit meinem aktuellen Design?

Antwort

4

Nun, der Grund, warum Sie Fehler erhalten, ist ziemlich einfach. Sie schreiben:

abstract class X[U: Y] 

Aber Sie wahrscheinlich so etwas wie dies bedeuten:

abstract class X[U <: Y] 

Unterschied zwischen diesen beiden Definitionen ist sehr bedeutsam. Der zweite Typ signalisiert, dass der Typ-Parameter U der Subtyp von Y (einschließlich Y) sein sollte. Aber der erste ist etwas anderes. Es wird auf die folgenden übersetzt:

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

Diese Syntax wurde eingeführt, um auf die Verwendung von Typklassen in scala mit weniger vorformulierten zu machen. Ich denke, Sie können jetzt die Quelle Ihres Fehlers sehen. Compiler erwartet, dass TaskUnit mit genau einem Typparameter Typ ist:

TaskUnit[T] { 
    ... 
} 

Aber es hat offensichtlich keine solche Form.

Verwandte Themen