22

タイプタグを使用して、いくつかのタイプのパラメータを確認できます。

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> typeOf[List[Int]]
res0: reflect.runtime.universe.Type = List[Int]

しかし、一般的な方法で、プログラムでその「Int」をそこから取り出す方法を完全に理解することはできません。

(私はREPLを1時間歩き回って、Typeの順列を試し、そこから何が得られるかを確認しています...これが「リスト」であることを示す多くの情報を取得しますが、見つけて幸運を祈りますその"Int"!そして私はtoString()出力の解析に頼りたくありません...)

Daniel Sobralは、ここで優れた(いつものように)簡単な概要を示しています。ここでは、彼は私が探しているものに興味をそそるほど近づいていますが、(明らかに)その特定のクラスについて、そのタイプが尋問:

scala> res0.member(newTermName("head"))
res1: reflect.runtime.universe.Symbol = method head

scala> res1.typeSignatureIn(res0)
res2: reflect.runtime.universe.Type = => Int

しかし、宣言されたメソッドのリストをルート化し、そのうちの1つがタグの現在のタイプ情報をどこかにキャプチャする(したがって公開する)ことを含まない、より一般的なものを望んでいます。

Scalaが「List[Int]」を簡単に印刷できるのなら、文字列パターンマッチングに頼らずに、なぜその「Int」の部分を見つけるのが難しいのでしょうか。それとも、本当に、本当に明白な何かが欠けているだけですか?

scala> res0.typeSymbol.asInstanceOf[ClassSymbol].typeParams
res12: List[reflect.runtime.universe.Symbol] = List(type A)

scala> res12.head.typeSignatureIn(res0)
res13: reflect.runtime.universe.Type = 

Grr..。

4

2 に答える 2

16

から始めてScala 2.11、次のように簡単に使用できます。

yourGenericType.typeArgs.head

マクロchangelogポイント番号14を参照してください。

于 2014-05-01T12:41:18.940 に答える
14

残念ながら、パラメータを提供するメソッドはないと思いますが、次の方法でパラメータを取得できます。

Welcome to Scala version 2.10.0-20121007-145615-65a321c63e (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_35).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> typeOf[List[Int]]
res0: reflect.runtime.universe.Type = scala.List[Int]

scala> res0 match { case TypeRef(_, _, args) => args }
res1: List[reflect.runtime.universe.Type] = List(Int)

scala> res1.head
res2: reflect.runtime.universe.Type = Int

編集 これは同じことを達成するための少し良い方法です(scala-internalsに関する議論に続いて):

scala> res0.asInstanceOf[TypeRefApi].args
res1: List[reflect.runtime.universe.Type] = List(Int)
于 2012-10-11T15:59:14.893 に答える