2013-07-09 15 views
5

Esiste un modo per associare solo al tipo generico passato in funzione? Mi piacerebbe fare:Come abbinare il tipo generico di scala?

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) 
} 

ho pensato a qualcosa di simile classOf o typeOf, ma nessuno di loro è accettabile solo per i tipi, ma oggetti.

La mia idea era anche di creare qualche oggetto di tipo T e quindi controllare il suo tipo, ma penso che ci possa essere una soluzione migliore.

risposta

6

È possibile utilizzare ClassTag.

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

O 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" 

Usage:

scala> getValue[String] 
res0: String = String 

scala> getValue[Int] 
res1: String = Int 

scala> getValue[Long] 
res2: String = Other 

Se si utilizza 2.9.x dovreste usare Manifest:

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. Ma oh, mi piacerebbe i generici reificati in Scala. :) –

+0

@ Patrykéwiek: È possibile memorizzare le informazioni sul tipo in qualche campo aggiuntivo, ma interromperà la compatibilità java. Non c'è modo di evitare la cancellazione del tipo nei tipi da java. – senia

+0

Lo so, lo so. Solo un pio desiderio. Forse sono solo un po 'viziato da C#/F #. –

Problemi correlati