2013-07-09 2 views
5

Gibt es eine Möglichkeit, nur auf den generischen Typ zu passen, der in Funktion übergeben wurde? Ich würde gerne tun:Wie scala generischen Typ zu entsprechen?

def getValue[T](cursor: Cursor, columnName: String): T = { 
    val index = cursor.getColumnIndex(columnName) 
    T match { 
     case String => cursor.getString(index) 
     case Int => cursor.getInteger(index) 
} 

Ich dachte an so etwas wie classOf oder typeOf, aber keiner von ihnen ist für nur Typen akzeptabel, aber Objekte.

Meine Idee war auch, ein Objekt vom Typ T zu erstellen und dann seinen Typ zu überprüfen, aber ich denke, dass es eine bessere Lösung geben kann.

Antwort

6

Sie könnten ClassTag verwenden.

val string = implicitly[ClassTag[String]] 
def getValue[T : ClassTag] = 
    implicitly[ClassTag[T]] match { 
    case `string` => "String" 
    case ClassTag.Int => "Int" 
    case _ => "Other" 
    } 

Oder TypeTag:

import scala.reflect.runtime.universe.{TypeTag, typeOf} 

def getValue[T : TypeTag] = 
    if (typeOf[T] =:= typeOf[String]) 
    "String" 
    else if (typeOf[T] =:= typeOf[Int]) 
    "Int" 
    else 
    "Other" 

Verbrauch:

scala> getValue[String] 
res0: String = String 

scala> getValue[Int] 
res1: String = Int 

scala> getValue[Long] 
res2: String = Other 

Wenn Sie 2.9.x verwenden Sie Manifest verwenden sollten:

import scala.reflect.Manifest 
def getValue[T : Manifest] = 
    if (manifest[T] == manifest[String]) 
    "String" 
    else if (manifest[T] == manifest[Int]) 
    "Int" 
    else 
    "Other" 
+1

+1. Aber ich würde gerne verdinglichte Generika in Scala lieben. :) –

+0

@ PatrykĆwiek: Es ist möglich, Typ Informationen in einem zusätzlichen Feld zu speichern, aber es wird Java-Kompatibilität zu brechen. Es gibt keine Möglichkeit, Typenlöschung in Java-Typen zu vermeiden. – senia

+0

Ich weiß, ich weiß. Nur Wunschdenken. Vielleicht bin ich nur ein bisschen von C#/F # verwöhnt. –