ich Schwierigkeiten haben zu verstehen, warum ein Java HashMap
mit einem Java Map
in Kotlin unvereinbar ist:Implementiert java.util.HashMap java.util.Map nicht in Kotlin?
val map : java.util.Map<Int, Int> = java.util.HashMap<Int, Int>()
// ERROR: Type mismatch
Ist das ein Bug oder ist es absichtlich durchgesetzt werden, um einen Fehler in Kotlin?
Hier ist ein zweites Beispiel mit dem Java Kotlin Compiler. Werfen Sie einen Blick auf diese Java-Beispiel-Datei:
public class Test {
public static void main(String[] args) {
java.util.Map<Integer, Integer> map = new java.util.HashMap<>();
insertValue(map);
}
private static void insertValue(java.util.Map<Integer, Integer> map) {
map.putIfAbsent(0, 1);
}
}
Running „Konvertieren Java Kotlin“ Ergebnisse in dieser Datei:
object Test {
@JvmStatic fun main(args: Array<String>) {
val map = java.util.HashMap<Int, Int>()
insertValue(map)
}
private fun insertValue(map: Map<Int, Int>) {
map.putIfAbsent(0, 1) // ERROR! Unresolved reference
}
}
Wenn ich versuche, es zu ändern, um mehr die ursprüngliche Datei zu reflektieren, wo insertValue
erwartet, dass eine Java java.util.Map
, ich einen anderen Fehler:
object Test {
@JvmStatic fun main(args: Array<String>) {
val map = java.util.HashMap<Int, Int>()
insertValue(map) // ERROR: Type mismatch
}
private fun insertValue(map: java.util.Map<Int, Int>) {
map.putIfAbsent(0, 1) // is now OK
}
}
Sind Sie sicher? Ich dachte, Kotlin.MutableMap' existiert zur Laufzeit nicht? – voddan
Korrigieren. Deshalb habe ich in meiner Antwort "zur Kompilierzeit" geschrieben. Kotlins [gemappte Typen] (https://kotlinlang.org/docs/reference/java-interop.html#mapped-types) sind zur Kompilierzeit verfügbar, werden dann aber zur Laufzeit anderen Typen zugeordnet. Mehr Details zu den Plattformtypen [hier] (https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types) und [hier] (https://kotlinlang.org/ docs/reference/java-interop.html # Notation-für-Plattform-Typen). – mfulton26