2015-10-15 6 views
5

मैं कक्षाकोटलिन में सामान्य प्रकार की जांच कैसे करें?

class Generic<T : SuperType>() 

है और इस कोड सही

fun typeCheck(s: SuperType): Unit { 
      when(s){ 
       is T -> //do some thin 
      } 
     } 

is't लेकिन s डाली टाइप करने के लिए Ts as T चेतावनी दिखाएं - असुरक्षित डाली।
कैसे जांचें s टाइप T है?

+0

स्ट्रिंग अंतिम है, आप 'टी: स्ट्रिंग' का उपयोग क्यों करेंगे? –

+0

@cypressious इसका सिर्फ उदाहरण – andreich

उत्तर

5

रनटाइम पर जेवीएम पर जेनेरिक प्रकारों को संशोधित नहीं किया जाता है, इसलिए कोटलिन में ऐसा करने का कोई तरीका नहीं है। चेतावनी सही है क्योंकि संकलक संभवतः कोई भी निर्देश उत्पन्न नहीं कर सकता है जो कास्ट होने पर असफल हो जाता है, इसलिए कास्ट अनचेक किया जाता है, जिसका अर्थ यह है कि कार्यक्रम किसी बिंदु पर बाद में टूट सकता है या नहीं।

इनलाइन फ़ंक्शंस में उपयोग की जाने वाली एक संबंधित सुविधा reified type parameters है। कक्षाओं में यद्यपि संशोधित प्रकार पैरामीटर नहीं हो सकते हैं, इसलिए यदि आप अपने उपयोग के मामले में थोड़ी अधिक जानकारी देते हैं, तो मैं आपको जो चाहिए उसे प्राप्त करने में आपकी सहायता करने का प्रयास कर सकता हूं।

13

यदि आपको यह जांचने की आवश्यकता है कि कुछ सामान्य प्रकार T है तो आपको जांच करने के लिए Class<T> का उदाहरण होना चाहिए। कोटलिन में जावा हूवर में यह एक आम तकनीक है, हम एक रेखांकित फैक्ट्री विधि का उपयोग कर सकते हैं जो हमें क्लास ऑब्जेक्ट प्राप्त करता है।

class Generic<T : Any>(val klass: Class<T>) { 
    companion object { 
     inline operator fun <reified T : Any>invoke() = Generic(T::class.java) 
    } 

    fun checkType(t: Any) { 
     when { 
      klass.isAssignableFrom(t.javaClass) -> println("Correct type") 
      else -> println("Wrong type") 
     } 

    } 
} 

fun main(vararg args: String) { 
    Generic<String>().checkType("foo") 
    Generic<String>().checkType(1) 
} 
+0

क्या आप मेरे प्रश्न का उत्तर दे सकते हैं? https://stackoverflow.com/questions/47418161/kotlin-get-type-of-generic-class-without-instance – murt

+0

महान चाल! क्या आप जानते हैं कि 'जेनेरिक' वर्ग अमूर्त होने पर इसे कैसे काम करना है? मेरी समस्या यह है कि 'ऑब्जेक्ट' ऑपरेटर पर बाल ऑब्जेक्ट को तुरंत चालू करना है। – ESala

+0

यह इतना आसानी से काम नहीं करेगा। बाल वर्ग के निर्माता को 'क्लास' उदाहरण सुपर कन्स्ट्रक्टर को पास करने की आवश्यकता होगी। –

संबंधित मुद्दे