2015-12-13 21 views
13

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 
    } 
} 

Odpowiedz

13

W Kotlin, A java.util.HashMap, w czasie kompilacji, nie implementuje java.util.Map, ale realizuje kotlin.collections.MutableMap która rozciąga się tylko do odczytu kotlin.collections.Map.

Dzieje się tak z powodu mapped types Kotlina. Aby uzyskać więcej informacji, zobacz Kolekcje w Kotlin M3 is Out!.

MutableMap nie definiuje żadnego putIfAbsent, ale ma funkcję rozszerzenia getOrPut.

+1

Jesteś pewien? Myślałem, że 'kotlin.MutableMap' nie istnieje w czasie wykonywania? – voddan

+0

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

0

myślę, że to błąd. Można go zgłosić tam https://youtrack.jetbrains.com/issues/KT

ale wciąż putIfAbsent jest Java 8 cecha, nie jest jeszcze obsługiwana w Kotlin (MutableMap interfejs brakuje tej metody).

+0

Dlaczego głosy na dół? –

+1

Podejrzewam, że głosy w dół wynikały z braku referencji, które potwierdzają tę odpowiedź. na przykład Ta odpowiedź mogła zostać uznana przez niektórych za pomocną, jeśli podano link do problemu lub odpowiednią dokumentację o [wołaniu Javy z Kotlin] (https://kotlinlang.org/docs/reference/java-interop.html), które stany/pokazuje, że kolekcje Java nie są specjalnie traktowane w Kotlin. – mfulton26

+0

Osobiście doceniam odpowiedź, ale żałuję, że nie zawiera ona konkretnego problemu lub dokumentacji potwierdzającej, że może to być błąd. – mfulton26

3

stworzyłem raport o błędzie, głównie dla „Java Kotlin” konwerter, który generuje nieprawidłowy kod Kotlin w moim oryginalnym przykład:

KT-10400 Java to Kotlin converter: converting Java Code where a java.util.HashMap is accessed through the java.util.Map interface fails

ja również wspomnieć, że java.util.HashMap nie implementuje java.util.Map ale zostawiam programiści Kotlin decydują, czy jest to błąd, czy też kompilator ma prawo go odrzucić.

AKTUALIZACJA: Błąd jest oznaczony jako rozwiązany (commit 5e231db6).

Powiązane problemy