के लिए मैं इस वर्ग में परिभाषित किया गया है:Kotlin IllegalAccessError साथ + = और - = सौंप इंटरफ़ेस
class NeverNullMap<K, V>(private val backing: MutableMap<K, V> = mutableMapOf(), val default:() -> V): MutableMap<K, V> by backing {
override operator fun get(key: K): V = backing.getOrPut(key, default)
}
और मैं यह बिल्कुल ठीक तरह उपयोग कर सकते हैं इस:
fun main(args: Array<String>) {
val myMap = NeverNullMap<String, Int> {0}
println(myMap["test"])
myMap["test"] = myMap["test"] + 10
println(myMap["test"])
}
उत्पादन की उम्मीद है के रूप में :
0
10
लेकिन जब मैं करने के लिए इसे बदलने की कोशिश:
fun main(args: Array<String>) {
val myMap = NeverNullMap<String, Int> {0}
println(myMap["test"])
myMap["test"] += 10
println(myMap["test"])
}
मैं:
Exception in thread "main" java.lang.IllegalAccessError: tried to access method kotlin.collections.MapsKt__MapsKt.set(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)V from class Day08Kt
at Day08Kt.main(Day08.kt:10)
हो रहा क्यों है?
संपादित करें:
decompiled कोड में थोड़ा खुदाई दोनों को पूरी तरह से अलग कोड का संकलन किया मिलता है।
काम कर संस्करण में +=
बिना यह करने के लिए संकलित हो जाता है:
Map var2 = (Map)myMap;
String var3 = "test";
Integer var4 = ((Number)myMap.get("test")).intValue() + 10;
var2.put(var3, var4);
गैर कार्यरत वर्शन पर संकलित हो जाता है: https://github.com/JetBrains/kotlin/blob/1.2.0/libraries/stdlib/src/kotlin/collections/Maps.kt#L175
मैं:
MapsKt.set(myMap, "test", ((Number)myMap.get("test")).intValue() + 10);
तो यह इस समारोह calles अभी भी कोई जानकारी नहीं है कि यह त्रुटि क्यों उत्पन्न करता है, सिर्फ पहला संस्करण अलग-अलग व्यवहार क्यों करता है।
संपादित करें: YouTrack link to the report
हू, दिलचस्प। तो मुझे शायद कोटलिन कंपाइलर में एक बग मिला? – usbpc102
@ usbpc102 ऐसा लगता है जैसे आपके पास है, हालांकि यह अजीब लगता है कि यह – Moira
होगा, मैंने अभी जांच की है और आपकी धारणा [यह निजी क्यों है सही है] (https://stackoverflow.com/questions/45763075/what-is- इनलाइनलाइन-एनोटेशन) – usbpc102