2013-07-17 6 views
5

Ich möchte eine Funktion wie folgt schreiben:Wie kann ich eine Funktion schreiben, die eine Case-Anweisung mit einem generischen Typ ausführt?

def genericCase[T]() : PartialFunction[Any, T] = { 
    case Wrapper(_, item: T) => item 
    case Wrapper(item: T, _) => item 
} 

In Worten, ich einen Weg wollen die Struktur einer Musterübereinstimmung mit verschiedenen Arten wieder zu verwenden.
Der Compiler teilt mir mit, dass die case x: T aufgrund der Typlöschung nie übereinstimmen wird. Was ist eine Alternative, um diese allgemeine Fallanweisung zu erstellen? Ich habe auch versucht, Typen in der Reflect-API als Argument für die Funktion zu verwenden, aber das konnten wir nicht herausfinden.

Antwort

5

Alles, was Sie brauchen, ist eine implizite ClassTag hinzuzufügen, die auf einer generischen Klasse anzupassen erlaubt:

import scala.reflect.ClassTag 

def genericCase[T: ClassTag]() : PartialFunction[Any, T] = { 
case Wrapper(_, item: T) => item 
case Wrapper(item: T, _) => item 
} 
Verwandte Themen