0

ここ数日、Scala でのリフレクションについていくつか質問しました。

新しいものは、実際には関連する 2 つの質問です。

  • 入力タイプに基づいて異なる結果を返す関数をどのように作成しますか?
  • リフレクション 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 に答える