यह मानते हुए कि मैं एक सामान्य सुपर क्लास है:स्कैला प्रतिबिंब में, एक ठोस उपclass के सामान्य प्रकार पैरामीटर कैसे प्राप्त करें?
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" स्केला प्रतिबिंब द्वारा की प्रकार पैरामीटर प्राप्त करना चाहते हैं, तो मैं चयन और फिल्टर अपने सदस्यों के माध्यम से:
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
}
}
मैं स्केला उम्मीद कर रहा था मुझे सही परिणाम है, जो List(List(Int))
है देने के लिए, के बजाय मैं केवल छ ओ.टी. सामान्य List(List(T))
दस्तावेज़ मुझे लगता है कि typeSignature पाया माध्यम से crunching दोषी है:
* 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
हालांकि, बाद से वर्ग उदाहरण नहीं है लंबे जेनेरिक, टाइपटाग [उदाहरण] से साइट प्राप्त करने का कोई तरीका नहीं है, क्या कोई मुझे बता सकता है कि टाइपऑफ [Int] केवल टाइपटाग [उदाहरण] दिया गया है? या ऐसा करने का कोई तरीका नहीं है और मुझे जावा प्रतिबिंब में वापस जाना है?
आपकी मदद के लिए बहुत बहुत धन्यवाद।
अद्यतन: कुछ त्वरित परीक्षण मैंने पाया कि यहां तक कि MethodSymbol.returnType इरादा है, तो निम्न कोड के रूप में काम नहीं करता है के बाद:
member.returnType
भी T
उपज, annd यह सही नहीं किया जा सकता asSeenFrom द्वारा, निम्नलिखित कोड परिणाम नहीं बदलती:
member.returnType.asSeenFrom(baseType.tpe, baseType.tpe.typeSymbol.asClass)
यहां तक कि इससे पहले कि वास्तव में अपने प्रश्न को पढ़ चुके हैं। स्कैला के साथ अपने पूरे अनुभव के दौरान, इसकी मूल अवधारणाओं में से एक को संकलक के रूप में उतना ही प्रतिनिधि देना है। तो प्रतिबिंब उन चीजों में से एक नहीं है जो आप स्कैला में करेंगे। हालांकि आप मैक्रोज़ या संदर्भ सीमाओं (मैनिफ़ेस्ट और क्लासमैनिफेट्स) का उपयोग कर सकते हैं – caeus
बहिष्कृत होने की प्रक्रिया में प्रकट होता है? और क्लासमैनिफेस्ट का नाम बदलकर क्लासटाग कर दिया गया? मुझे आशा है कि मैं कम से कम मिटाए गए क्लासटैग को विधि से प्राप्त कर सकता हूं, लेकिन फिर भी ऐसा करने में असमर्थ है। – tribbloid