我在最近几天询问了有关Scala反思的几个问题,因为它对我来说似乎仍然是新的。
新的实际上是两个相关的问题:
TypeSymbol
和Type
对象执行相同操作?示例(不编译,但这大致是我希望它如何工作):
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"
}
答案 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)