2013-07-09 4 views
5

함수에서 전달되는 제네릭 유형에만 일치하는 방법이 있습니까? 내가 할 싶습니다스칼라 제네릭 유형과 일치하는 방법은 무엇입니까?

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

나는 classOf 또는 typeOf 같은 생각하지만, 그들 중 누구도 단지 유형,하지만 개체에 대한 허용하지 않습니다.

제 생각에는 유형 T의 개체를 만든 다음 형식을 확인하는 것이 더 나은 해결책이라고 생각합니다.

답변

6

ClassTag을 사용할 수 있습니다.

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

또는 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" 

사용법 :

scala> getValue[String] 
res0: String = String 

scala> getValue[Int] 
res1: String = Int 

scala> getValue[Long] 
res2: String = Other 

당신이 2.9.x을 사용하는 경우 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. 그러나 오, 나는 스칼라에서 구체화 된 제네릭을 좋아할 것입니다. :) –

+0

@ Patryküwiek : 일부 추가 필드에 형식 정보를 저장할 수도 있지만 Java 호환성을 깨뜨릴 수 있습니다. java의 유형에서 유형 삭제를 피할 방법이 없습니다. – senia

+0

알아, 알아. 단지 희망찬 생각. 어쩌면 나는 C#/F #에 조금 부끄럽다. –

관련 문제