Mit Typ-Tags, ich bin in der Lage zu die Parameter eines bestimmten Typs zu sehen:Typ Parameter über Reflexion in Scala 2.10 zu finden?
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> typeOf[List[Int]]
res0: reflect.runtime.universe.Type = List[Int]
Aber ich kann ganz einfach nicht herausfinden, wie programmatisch, dass „Int“ von dort in einem, erhalten allgemeiner Weg.
(Ich bin jetzt seit einer Stunde in REPL herumgelaufen, versuche Permutations auf Type, um zu sehen, was ich davon bekommen kann ... Ich bekomme eine Menge Dinge, die darauf hinweisen, dass es sich um eine "Liste" handelt Viel Glück bei der Suche nach diesem "Int"! Und ich möchte nicht wirklich auf die toString() Ausgabe zu analysieren ...)
Daniel Sobral hat eine ausgezeichnete (wie immer) schnellen Überblick here, in der er bekommt
scala> res0.member(newTermName("head"))
res1: reflect.runtime.universe.Symbol = method head
scala> res1.typeSignatureIn(res0)
res2: reflect.runtime.universe.Type = => Int
: aufreizend nah an, was ich suche, aber (anscheinend) nur, wenn Sie für diese bestimmte Klasse passieren zu wissen, können einige spezifische Methode, deren Typ abgefragt werdenAber ich hoffe auf etwas Allgemeineres, was nicht bedeutet, in der Liste der deklarierten Methoden herumzuwühlen und zu hoffen, dass einer von ihnen die aktuelle Typinformation des Tags irgendwo erfassen (und somit preisgeben wird).
Wenn Scala kann so leicht Drucken "Liste [Int]", warum in aller Welt ist es so schwer zu entdecken, dass "Int" Teil davon - ohne Rückgriff auf Zeichenfolge Mustererkennung? Oder vermisse ich gerade etwas wirklich, wirklich Offensichtliches?
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 ...
Hier ist eine Nicht-Antwort: mit M7 mindestens Sie die Typargumente durch Gießen auf eine interne bekommen API: 'typeOf [Liste [Int]]. AsInstanceOf [scala.reflect.internal.Types $ TypeApiImpl] .typeArguments'. –
Clever! Vielen Dank. – Tim