0

过去几天我问了几个关于 Scala 反射的问题,因为它对我来说仍然很新。

新问题实际上是两个相关的问题:

  • 您将如何创建一个根据输入类型返回不同结果的函数?
  • 你能对反射 API 返回的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"
}
4

1 回答 1

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

但是请注意,使用TypeTags 暂时是线程不安全的。据我所知,这应该会在几个月内改变,可能在 Scala 2.10.2 中(参见SI-6240

于 2013-04-03T20:55:14.570 回答