2015-12-13 6 views
13

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

Antwort

13

In Kotlin, ein java.util.HashMap, bei der Kompilierung, nicht implementiert java.util.Map, sondern implementiert kotlin.collections.MutableMap, das die Nur-Lese-kotlin.collections.Map erstreckt.

Dies ist wegen Kotlins mapped types. Weitere Informationen finden Sie unter Kollektionen in Kotlin M3 is Out!.

MutableMap definiert keine putIfAbsent, aber es hat eine Erweiterungsfunktion getOrPut.

+1

Sind Sie sicher? Ich dachte, Kotlin.MutableMap' existiert zur Laufzeit nicht? – voddan

+0

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

0

ich denke, es ist ein Fehler. Sie können es dort https://youtrack.jetbrains.com/issues/KT

berichten Aber noch putIfAbsent ist ein Java-8-Funktion, noch nicht in Kotlin unterstützt (MutableMap Schnittstelle dieser Methode fehlt).

+0

Warum die Herabstufungen? –

+1

Ich vermute, dass die Down-Stimmen wegen fehlender Referenzen waren, die diese Antwort unterstützen. z.B. Diese Antwort könnte von einigen als hilfreicher angesehen werden, wenn ein Link zu einem Problem oder eine relevante Dokumentation über [Aufruf von Java aus Kotlin] (https://kotlinlang.org/docs/reference/java-interop.html) bereitgestellt wurde, die/zeigt, dass Java-Sammlungen in Kotlin nicht speziell behandelt werden. – mfulton26

+0

Persönlich schätze ich die Antwort, aber ich wünschte, es würde auf ein konkretes Problem oder eine Dokumentation verweisen, die darauf hinweist, dass es sich um einen Fehler handeln könnte. – mfulton26

3

ich einen Fehlerbericht erstellt, in erster Linie für den „Java Kotlin“ Konverter, der ungültig Kotlin Code in meinem ursprünglichen Beispiel erzeugt:

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

Ich erwähnte auch, dass java.util.HashMap nicht java.util.Map nicht implementiert, aber ich überlasse es den Kotlin-Entwicklern zu entscheiden, ob es sich um einen Bug handelt oder ob der Compiler das Recht hat, ihn abzulehnen.

UPDATE: Der Fehler ist als gelöst markiert (commit 5e231db6).

Verwandte Themen