1

TypeRefエイリアスの元の型 (および型パラメーター) に型エイリアスを展開するにはどうすればよいですか?

参照する型がOption[List[Double]]あり、私が行う場合:

case myType @ TypeRef(_, sym, args) if myType <:< typeOf[Option[Any]] ⇒

私は得る:

  • symOption
  • args.headであり、そのタイプList[Double]で処理を続行できます。Double

型エイリアスあり

タイプOption[MyType]とタイプエイリアスがtype Mytype = List[Double]あり、次のようにします。

case myType @ TypeRef(_, sym, args) if myType <:< typeOf[Option[Any]] ⇒

私はこれを得る:

  • symOption
  • args.headMyType

リフレクションでどのように拡張MyTypeしますか? であるList[Double]と判断できましたが、ネストされた型パラメーターを取得できません。MyTypeListDouble


Scaladoc 参照

TypeRef エクストラクタ:

TypeRef(
  pre: Universe.Type,
  sym: Universe.Symbol,
  args: List[Universe.Type])
4

1 に答える 1

4

normalizeメソッドTypeが役立つと思います:

型エイリアスを展開し、より高次の TypeRef を PolyType に変換します。型の関数も PolyTypes として実装されます。例: (以下では、 は List の型コンストラクタです) TypeRef(pre, , List()) は PolyType(X, TypeRef(pre, , List(X))) に置き換えられます

タイプtがあれば、 のようなこともできますt.map(_.normalize)。これにより、定義の一部であるすべての型(型引数など)tと同様に正規化されます。tしたがって、効果的にこれにより、 のどこかにあるエイリアスがすべて削除されますt

于 2013-06-04T07:55:54.263 に答える