Ben bir Genel üst sınıf olduğunu varsayarsakScala Yansımada, bir beton alt sınıfının jenerik tip parametresi nasıl alınır?</p> <pre><code>class GenericExample[T]( a: String, b: T ) { def fn(i: T): T = b } </code></pre> <p>ve somut bir alt sınıfı:
case class Example(
a: String,
b: Int
) extends GenericExample[Int](a, b)
Ben scala yansıma yoluyla fonksiyonu "fn" tipi parametresini elde etmek istiyorum, bu yüzden seçip filtre üyeleri aracılığıyla:
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
}
}
bana List(List(Int))
olan doğru sonucu vermek için scala bekliyordum, bunun yerine sadece g ot jenerik Ben typeSignature bulundu belgenin içinden Crunching List(List(T))
suçlu:
* 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.
Ve alternatifi kullanmak için bana önerir: Sınıf Örneği hayır olduğundan,
def typeSignatureIn(site: Type): Type
Ancak daha uzun jenerik, tipTag'dan [Örnek] site almamın bir yolu yok, kimse bana typeTf [Int] nasıl yazılacağını önerebilir sadece tipTag [Örnek]? Ya da bunu yapmanın bir yolu yok ve Java yansımasına geri dönmem gerekiyor mu?
Yardımlarınız için çok teşekkürler.
GÜNCELLEME: Hatta MethodSymbol.returnType, aşağıdaki kodu amaçlandığı gibi çalışmadığını tespit bazı hızlı testinden sonra: Ayrıca T
verim
member.returnType
, annd düzeltilmesi edilemez aşağıdaki kod sonucu değişmez olarak asSeenFrom tarafından,:
member.returnType.asSeenFrom(baseType.tpe, baseType.tpe.typeSymbol.asClass)
Sorunuzu okumadan önce bile. Scala ile olan tüm deneyimim boyunca, temel kavramlarından biri derleyiciye olabildiğince fazla yetki vermektir. Yani yansıma, scalada yapacağınız şeylerden biri değildir. Ancak Makroları veya bağlam sınırlarını (Manifest ve ClassManifests) kullanabilirsiniz – caeus
Kullanımdan kaldırılma sürecinde Manifest mi? Ve ClassManifest ClassTag olarak yeniden adlandırıldı mı? Umarım en azından silinmiş ClassTag'ı yöntemden alabilirim, ama yine de bunu yapamaz. – tribbloid