2013-04-03 86 views
0

在过去的几天里,我已经问过几个关于Scala反射的问题,因为它对我来说似乎还是个新东西。Scala中的匹配类型符号

新的一个实际上是涉及两个问题:

  • 你会如何创建一个返回根据输入类型不同结果的功能?
  • 你可以用反射API返回的TypeSymbolType对象来做同样的事吗?

例(不编译,但是这大概我怎么想它的工作):

def result[T <: String] = "STRING" 
def result[T <: Int] = "INT" 

result[String] // Returns "STRING" 
result[Int]  // Returns "INT" 

val type_symbol: Type = ... // Get a Type object from a reflection 
type_symbol match { 
    case Int => "INT" 
    case String => "STRING" 
    case _ => "OTHER" 
} 

回答

3

也许是这样的你在找什么?

import scala.reflect.runtime.universe._ 

def someStringBasedOnAType[T: TypeTag] = typeOf[T] match { 
    case t if t =:= typeOf[Int] => "INT" 
    case t if t =:= typeOf[String] => "STRING" 
    case _ => "OTHER" 
} 

结果:

scala> someStringBasedOnAType[String] 
res11: String = STRING 

scala> someStringBasedOnAType[Float] 
res12: String = OTHER 

scala> someStringBasedOnAType[Int] 
res13: String = INT 

注意,但是,使用TypeTag s是线程安全的一个时刻。据我所知,这应该在几个月内改变,可能在Scala 2.10.2(见SI-6240

+0

谢谢,正是我需要的! – 2013-04-05 06:32:30