आपका त्रुटि संदेश जाता है कि is
जांच एक उम्मीद कक्षा का नाम और दाईं तरफ KClass का संदर्भ नहीं है। संदेश स्वयं थोड़ा अस्पष्ट हो सकता है। लेकिन जावा में भी यही लागू होता है, आप instanceOf
ऑपरेटर का उपयोग नहीं करेंगे बल्कि इसके बजाय isAssignableFrom
पर कॉल करेंगे।
समस्या को हल करने में मदद के लिए, आप
में Klutter library instanceof शैली,, Class
के बीच KClass
Type
और KType
के रूप में जाँच के संयोजन का एक बहुत के उदाहरण हैं Github में पाया जा सकता है कि उदाहरण ... है प्राइमेटिव के रूप में अच्छी तरह से। आप वहां से विचारों की प्रतिलिपि बना सकते हैं। ऐसे कई संयोजन हैं जिन्हें आप लंबे समय तक कवर करना चाहते हैं।
यह जांचने के लिए a big mix of extensions का एक नमूना है कि एक प्रकार दूसरे से असाइन करने योग्य है या नहीं। कुछ उदाहरण हैं:
fun <T : Any, O : Any> KClass<T>.isAssignableFrom(other: KClass<O>): Boolean {
if (this.java == other.java) return true
return this.java.isAssignableFrom(other.java)
}
fun <T : Any> KClass<T>.isAssignableFrom(other: Class<*>): Boolean {
if (this.java == other) return true
return this.java.isAssignableFrom(other)
}
fun KClass<*>.isAssignableFromOrSamePrimitive(other: KType): Boolean {
return (this.java as Type).isAssignableFromOrSamePrimitive(other.javaType)
}
fun KClass<*>.isAssignableFromOrSamePrimitive(other: Type): Boolean {
return (this.java as Type).isAssignableFromOrSamePrimitive(other)
}
fun Type.isAssignableFromOrSamePrimitive(other: Type): Boolean {
if (this == other) return true
if (this is Class<*>) {
if (other is Class<*>) {
return this == other.kotlin.javaObjectType || this == other.kotlin.javaPrimitiveType ||
this.isAssignableFrom(other)
}
return this.isAssignableFrom(other.erasedType())
}
return this.erasedType().isAssignableFrom(other.erasedType())
}
// ... and so on for every permutation of types
linked source for all permutations देखें।
और आप इस erasedType()
extension ऊपर नमूने द्वारा इस्तेमाल किया की आवश्यकता होगी - जो एक Type
पीछे से एक Class
(प्रकार के बाद विलोपन) को जाता है:
@Suppress("UNCHECKED_CAST") fun Type.erasedType(): Class<Any> {
return when (this) {
is Class<*> -> this as Class<Any>
is ParameterizedType -> this.getRawType().erasedType()
is GenericArrayType -> {
// getting the array type is a bit trickier
val elementType = this.getGenericComponentType().erasedType()
val testArray = java.lang.reflect.Array.newInstance(elementType, 0)
testArray.javaClass
}
is TypeVariable<*> -> {
// not sure yet
throw IllegalStateException("Not sure what to do here yet")
}
is WildcardType -> {
this.getUpperBounds()[0].erasedType()
}
else -> throw IllegalStateException("Should not get here.")
}
}
स्रोत
2016-09-21 23:55:04
मेरे सहयोगी एक और एसओ पद जो कहते हैं Kotlin है पाया ऐसा करने का कोई तरीका नहीं है और जावा प्रतिबिंब का उपयोग करने का एकमात्र तरीका है (मान लें कि आप JVM को लक्षित कर रहे हैं)। http://stackoverflow.com/questions/35851719/how-to-compare-classes-and-interfaces/35852445#35852445 – zjuhasz