2016-10-19 5 views
24

में "*" और "कोई भी" के बीच अंतर मुझे यकीन नहीं है कि मैं SomeGeneric<*> और SomeGeneric<Any> के बीच अंतर को पूरी तरह से समझता हूं। मुझे लगता है कि "*" कुछ भी दर्शाता है (वाइल्ड कार्ड) और "कोई भी" उस ऑब्जेक्ट का प्रतिनिधित्व करता है जो ऑल ऑब्जेक्ट्स से प्राप्त होता है। तो ऐसा लगता है कि वे वही होना चाहिए, लेकिन वे नहीं हैं?कोटलिन जेनेरिक

उत्तर

32

star projection को किसी भी प्रकार का प्रतिनिधित्व करने के तरीके के रूप में सोचने में मददगार हो सकता है, लेकिन कुछ निश्चित प्रकार जिन्हें आप बिल्कुल नहीं जानते हैं।

उदाहरण के लिए, MutableList<*>की सूची का प्रतिनिधित्व करता है (आपको बिल्कुल पता नहीं है)। तो यदि आप इस सूची में कुछ जोड़ने का प्रयास करते हैं, तो आप सफल नहीं होंगे। यह String एस की सूची हो सकती है, या Int एस की सूची हो सकती है, या किसी और चीज की सूची हो सकती है। कंपाइलर इस सूची में किसी वस्तु को बिल्कुल भी रखने की अनुमति नहीं देगा क्योंकि यह सत्यापित नहीं कर सकता कि सूची इस प्रकार की वस्तुओं को स्वीकार करती है। हालांकि, अगर आप ऐसी सूची से तत्व प्राप्त करने का प्रयास करते हैं, तो आपको निश्चित रूप से Any? टाइप करने का ऑब्जेक्ट मिलेगा, क्योंकि कोटलिन की सभी ऑब्जेक्ट्स Any से प्राप्त होती हैं।

+15

अच्छा जवाब, कुछ के लिए यह सूची उपयोगी हो सकती है कि सूची <*> में * किसी * प्रकार की वस्तुएं हो सकती हैं, लेकिन * केवल * उस प्रकार की वस्तुएं हो सकती हैं, इसलिए इसमें स्ट्रिंग्स (लेकिन केवल स्ट्रिंग्स) हो सकती है, जबकि सूची स्ट्रिंग्स हो सकती है और इंटीजर्स और क्या नहीं, सभी एक ही सूची में। – FWeigl

+0

@AlexanderUdalov pls, एस्कोरबिन की टिप्पणी संपादित करें। मैंने आपका अच्छा जवाब पढ़ा, लेकिन जब मैंने टिप्पणी पढ़ी तो यह तुरंत स्पष्ट हो गया! –

10

संदर्भ में मुझे लगता है कि आपको लगता है कि, SomeGeneric<*>SomeGeneric<out Any?> के बराबर है। जावा समतुल्य SomeGeneric<? extends Object> है।

वाक्यविन्यास "स्टार-अनुमान" कहा जाता है। आधिकारिक दस्तावेज़ यहां दिए गए हैं: https://kotlinlang.org/docs/reference/generics.html#star-projections