मुझे यकीन नहीं है कि 'हार्ड-असफल' सही शब्द है, लेकिन यहां समस्या है जिसका सामना मैं कर रहा हूं। और यह मुझे काफी कुछ समय साथ ले जाती है छोटी संभव उदाहरण के लिए इस पुन: पेश करने, इसलिए यहाँ यह जाता है:कोटलिन एक अनुमानित (इन-साइट) पैरामीटर को अप-कास्ट हार्ड-असफल कर रहा है
class BaseParameterizedType<T>
fun <U: BaseParameterizedType<*>> getSpecific(clazz: KClass<in U>) : U {
TODO()
}
fun example(arg: KClass<out BaseParameterizedType<*>>)) {
getSpecific(arg.innerType)
}
ठीक है, तो कोड के ऊपर 'यह करें' पर विफल रहता है, लेकिन अगर यह वहाँ है और यदि नहीं था समारोह सामान्य रूप से लौटा, तो यह निश्चित रूप से एक शून्य सूचक अपवाद के साथ विफल रहता है। मैं यह पता लगाने की क्या गलत हो रहा था बहुत कोशिश की, तो मैं (kotlin बाईटकोड से) decompiled जावा कोड में बदल गया:
public static final void example(@NotNull KClass arg) {
Intrinsics.checkParameterIsNotNull(arg, "arg");
getSpecific(arg.getInnerType());
throw null; // <-- The problem
}
अगर मैं इन रूपों में से किसी को getSpecific(clz: KClass<in U>) : U
के समारोह हस्ताक्षर बदलने के लिए:
getSpecific(clz: KClass<out U>) : U
getSpecific(clz: KClass<U>) : U
getSpecific(clz: KClass<in U>) : BaseParameterizedType<*>
या example(arg: KClass<out BaseParameterizedType<*>)
या example(arg: KClass<BaseParameterizedType<*>>)
को भी समारोह है, तो उत्पन्न कोड है:
public static final void example(@NotNull KClass arg) {
Intrinsics.checkParameterIsNotNull(arg, "arg");
getSpecific(arg.getInnerType());
}
अब, चलो कॉल-स्थल पर मान लीजिए, मैं यह करने के लिए बदलने के लिए:
getSpecific(BaseParameterizedType::class)
तो यह भी नहीं है throw null
खंड उत्पन्न करें। तो, मुझे लगता है कि कोटलिन के साथ ऐसा कुछ करने का अनुमान है कि यह कलाकार हमेशा असफल रहेगा या अनुमान लगाने के लिए अनिश्चित जानकारी उपलब्ध है?
तो, हम जानते हैं कि arg.innerType
KClass<out BaseParameterizedType<*>>
है और हम एक साइट KClass<in BaseParameterizedType<*>>
को स्वीकार करने में इसका इस्तेमाल करते हैं, तो क्यों U
BaseParamterizedType<*>>
को अनुमानित नहीं है। यह सचमुच एकमात्र प्रकार है जो कभी मेल खाता है।
उसी समय, मुझे लगता है कि सिर्फ throw null
कथन उत्पन्न करना अविश्वसनीय रूप से डीबग करना मुश्किल है। स्टैकट्रैक केवल उस रेखा को इंगित करेगा जहां getSpecific
है और अच्छी किस्मत यह पता लगाना है कि शून्य सूचक अपवाद कहाँ से आया था।
हाल ही में इस मुद्दे सतह किया? क्योंकि यह कोड का हिस्सा है जो मेरे लिए पूरी तरह से काम कर रहा था, और यह हाल ही में तोड़ दिया। मुझे खेद है कि मैं सटीक कोटलिन संस्करण को पिन-पॉइंट करने में सक्षम नहीं हूं, जहां इसे तोड़ना शुरू हो गया क्योंकि हम संस्करण को अद्यतन करना जारी रखते हैं और यह ऐसा कुछ है जो दुर्भाग्यवश हमारे परीक्षण-मामलों से ढंका नहीं है और यह शायद ही कभी पहुंच गया है कोड। इसलिए यह पता लगाना मुश्किल है कि वास्तव में तोड़ना शुरू हो गया था। –