mam kłopoty ze zrozumieniem, dlaczego Java HashMap
jest niezgodna z Java Map
w Kotlin:Czy java.util.HashMap nie implementuje java.util.Map w Kotlin?
val map : java.util.Map<Int, Int> = java.util.HashMap<Int, Int>()
// ERROR: Type mismatch
Jest to błąd, czy jest to celowo egzekwowane być błąd w Kotlin?
Oto drugi przykład z kompilatorem Java do Kotlin. Spójrz na ten przykład pliku Java:
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 „Convert Java do Kotlin” wyników w tym pliku:
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
}
}
Gdy próbuję go zmodyfikować, aby odzwierciedlić bardziej oryginalnego pliku, gdzie insertValue
oczekuje Java java.util.Map
, otrzymuję inny błąd:
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
}
}
Jesteś pewien? Myślałem, że 'kotlin.MutableMap' nie istnieje w czasie wykonywania? – voddan
Prawidłowo. Dlatego w mojej odpowiedzi napisałem "w czasie kompilacji". Typy zmapowane Kotlin (https://kotlinlang.org/docs/reference/java-interop.html#mapped- typeses) są dostępne w czasie kompilacji, a następnie mapowane do różnych typów w środowisku wykonawczym. Więcej szczegółów na temat typów platform [tutaj] (https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types) i [tutaj] (https://kotlinlang.org/ docs/reference/java-interop.html # notation-for-platform-types). – mfulton26