3

私が持っていると言う

trait Foo[T] { def bar: Bar[T] }

barそして、 a で呼び出されたときFoo[Int](つまりBar[Int]、この場合) の型タグFoo[Int]と名前から の戻り値の型を取得したい"bar"(オーバーロードがないと仮定するか、それらを区別することができます)。これはscala-reflectで行うことができますか?

4

2 に答える 2

4

これはあなたが望むものに近いですか(を使用してasSeenFrom)?

val tt = typeTag[Foo[Int]]

scala> tt.tpe
    .members
    .find(_.name.toString == "bar").get
    .asMethod
    .returnType
    .asSeenFrom(tt.tpe, tt.tpe.typeSymbol)

res68: reflect.runtime.universe.Type = Bar[Int]

もちろん、私は型安全性を窓の外に投げ出しました。少し良い:

scala> tt.tpe
     .members
     .find(_.name.toString == "bar")
     .filter(_.isMethod)
     .map(_.asMethod.returnType.asSeenFrom(tt.tpe, tt.tpe.typeSymbol))

res74: Option[reflect.runtime.universe.Type] = Some(Bar[Int])
于 2015-03-25T14:29:12.180 に答える