मेरे पास एक इंटरफ़ेस है जिसमें टी और कुछ मेटाडेटा की सरणी (या सूची) शामिल है।कोटलिन जेनेरिक ऐरे <T> परिणाम "टी को एक संशोधित प्रकार पैरामीटर के रूप में उपयोग नहीं कर सकते हैं। इसके बजाए कक्षा का उपयोग करें" लेकिन सूची <T>
interface DataWithMetadata<T> {
val someMetadata: Int
fun getData(): Array<T>
}
अगर मैं इंटरफेस का सबसे सरल कार्यान्वयन लिखते हैं, मैं पर एक संकलन त्रुटि मिलती है emptyArray()
: "एक reified प्रकार पैरामीटर के रूप में टी उपयोग नहीं कर सकते बजाय एक वर्ग का प्रयोग करें।।"
class ArrayWithMetadata<T>(override val someMetadata: Int): DataWithMetadata<T> {
private var myData: Array<T> = emptyArray()
override fun getData(): Array<T> {
return myData
}
fun addData(moreData: Array<T>) {
this.myData += moreData
}
}
हालांकि, अगर मैं दोनों इंटरफेस और एक सूची में कार्यान्वयन बदलने के लिए, मेरे पास कोई संकलन समय मुद्दे हैं:
interface DataWithMetadata<T> {
val someMetadata: Int
fun getData(): List<T>
}
class ListWithMetadata<T>(override val someMetadata: Int): DataWithMetadata<T> {
private var myData: List<T> = emptyList()
override fun getData(): List<T> {
return myData
}
fun addData(moreData: Array<T>) {
this.myData += moreData
}
}
मुझे लगता है कि मेरे इस मुद्दे को अंदर Kotlin जेनरिक में कुछ दिलचस्प सबक है । क्या कोई मुझे बता सकता है कि संकलक हुड के नीचे क्या कर रहा है और क्यों ऐरे विफल रहता है लेकिन सूची नहीं है? इस संदर्भ में ऐरे कार्यान्वयन संकलन करने के लिए कोई मूर्ख तरीका है?
बोनस प्रश्न: सूची में ऐरे के लिए पहुंचने का एकमात्र कारण यह है कि मैं अक्सर कोटलिन डेवलपर्स को Arrays के पक्ष में देखता हूं। क्या यह मामला है, और यदि हां, तो क्यों?
public inline fun <reified @PureReifiable T> emptyArray(): Array<T>
reified
प्रकार पैरामीटर मतलब है कि आप संकलन समय पर T
के वर्ग की पहुंच है: