Generic スーパークラスがあると仮定します。
class GenericExample[T](
a: String,
b: T
) {
def fn(i: T): T = b
}
および具象サブクラス:
case class Example(
a: String,
b: Int
) extends GenericExample[Int](a, b)
関数 "fn" の型パラメーターを scala リフレクションによって取得したいので、そのメンバーを選択してフィルター処理します。
import ScalaReflection.universe._
val baseType = typeTag[Example]
val member = baseType
.tpe
.member(methodName: TermName)
.asTerm
.alternatives
.map(_.asMethod)
.head
val paramss = member.paramss
val actualTypess: List[List[Type]] = paramss.map {
params =>
params.map {
param =>
param.typeSignature
}
}
私はscalaが正しい結果を与えることを期待していましたList(List(Int))
.List(List(T))
ドキュメントをざっと見てみると、typeSignature が原因であることがわかりました。
* This method always returns signatures in the most generic way possible, even if the underlying symbol is obtained from an
* instantiation of a generic type.
そして、別の方法を使用することをお勧めします:
def typeSignatureIn(site: Type): Type
ただし、クラス Example はもはやジェネリックではないため、typeTag[Example] からサイトを取得する方法はありません。それとも、それを行う方法がなく、Java リフレクションに戻す必要がありますか?
どうもありがとうございました。
更新:いくつかの簡単なテストの後、MethodSymbol.returnTypeでさえ意図したとおりに機能しないことがわかりました。次のコード:
member.returnType
次のコードは結果を変更しないため、asSeenFromでT
修正することはできません。
member.returnType.asSeenFrom(baseType.tpe, baseType.tpe.typeSymbol.asClass)