在Scala中匹配类型符号

时间:2013-04-03 20:37:46

标签: scala reflection

我在最近几天询问了有关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"
}

1 个答案:

答案 0 :(得分: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