2017-06-20 2 views
0

Ziel ist Schöpfer Funktion definieren, welche Art von Nachricht, Schauspieler zu schreiben erhalten, und passen Sie diese Art von Nachricht innerhalb Schauspieler. Deshalb möchte ich angeben, dass meine erwartete Nachricht vom Typ X ist (ich weiß, diese Art nur dann, wenn i-Funktion aufrufen, erstellen)Allgemein Pattern-Matching und Typ Löschung

Ich habe einen ganz einfachen Code:

import akka.actor.Actor.Receive 

def create[X]():Receive = { 
    case msg:X => 
} 

Dieser Code gibt mir die folgende Fehler : „abstraktes Typ Muster X ist nicht markiert, da sie durch das Löschen beseitigt“

ich weiß, was Typ Löschung ist, aber ich kann keine Lösung für dieses Problem nicht finden.

+0

Haben Sie http://daily-scala.blogspot.ca/2010/01/overcoming-type-erasure-in-matching-1.html gesehen? –

Antwort

0

A ClassTag wird ziemlich genau diese handhaben:

def create[X](implicit tag: ClassTag[X]): Receive = { 
    case msg if msg.getClass == tag.runtimeClass => 
} 

Beachten Sie aber, dass, wenn Ihr Nachrichtentyp selbst nach Typ Löschung betroffen ist, wird dies nicht gelingen. Zum Beispiel akzeptiert create[List[String]] immer noch eine List[Int]. Ich glaube nicht, dass es einen Weg gibt, da diese Informationen zur Laufzeit komplett weg sind.

+3

Einfach 'def erstellen [X: ClassTag]: Empfangen = { Fall msg: X => }' wird auch funktionieren – Kolmar

+0

Vielen Dank, Dies ist genau das, was ich gesucht habe – Antek