オブジェクトを作成した後に型フィールドの型を取得することは可能ですか?
私はこのようなことをしたいと思います:
scala> class A { type T = String }
defined class A
scala> val a = new A
a: A = A@591171
scala> a.T
<console>:13: error: value T is not a member of A
a.T
^
最後
タイプで何をしたいですか?クラスの型 (インスタンスなし) を使用して、さまざまな方法で型射影を使用できます。
scala> class A { type T = String }
defined class A
scala> val x: A#T = "test"
x: java.lang.String = test
scala> def f(b: A#T) = b
f: (a: java.lang.String)java.lang.String
または、 を有効-Ydependent-method-types
にすると、インスタンスからタイプ メンバーを取得できます。
scala> val a = new A
a: A = A@6a3de2df
scala> val x: a.T = "test"
x: a.T = test
scala> def f(b: a.T) = b
f: (b: a.T)a.T
2.10 より前の Scala のリフレクション API は、実際にはきれいな方法で型をモデル化していません。
1 つの方法はリフレクションを使用することです (2.10M4 以降):
// with static types
scala> class A { type T = String }
defined class A
scala> import reflect.runtime.{universe => u}
import reflect.runtime.{universe=>u}
scala> val t = u.typeOf[A]
t: reflect.runtime.universe.Type = A
scala> val types = t.declarations.filter(_.isType)
types: Iterable[reflect.runtime.universe.Symbol] = SynchronizedOps(type T)
scala> types.toList.head.typeSignature
res9: reflect.runtime.universe.Type = String
// with instances
scala> val a = new A
a: A = A@68d7c870
scala> import reflect.runtime.{currentMirror => m}
import reflect.runtime.{currentMirror=>m}
scala> m.reflect(a).symbol.asType // same type as t
res20: reflect.runtime.universe.Type = A