Tipps zur Interoperabilität mit Kotlin zum Senden an Java-Entwickler

Beim Aufrufen von Kotlin-Code aus Java

Standardargument

Wenn Sie Kotlins Funktionen mit Standardargumenten aus Java behandeln möchten, müssen Sie alle Argumente angeben. Wenn Sie der Funktion jedoch die Annotation @ JvmOverload hinzufügen, wird die Überladungsmethode automatisch generiert.

// Kotlin
class OverloadSample {
    @JvmOverloads //Durch Annotieren wird eine überladene Methode generiert, die von Java aus aufgerufen werden kann
    fun test(arg1: Boolean = true, arg2: Int = 1, arg3: String = "true") : Boolean {
        return arg1 && arg2 == 1 && arg3 == "true"
    }
}

Lassen Sie uns den Aufrufcode von Java implementieren.

// Java
OverloadSample os = new OverloadSample();
os.test(true, 1, "true");
os.test(true, 1);
os.test(true);

Funktionen, Eigenschaften der obersten Ebene

Aufrufen von Kotlin-Funktionen der obersten Ebene, die nicht zu einer Klasse gehören, aus Java. Kotlins Top-Level-Funktionen Eine Klasse mit dem Namen "Quelldateiname + Kt" wird generiert Es wird in eine statische Funktion dieser Klasse kompiliert.

// Utility.kt
fun doSomething() {
    // Do something
}
// Java
UtilityKt.doSomething();

Wenn Sie den obigen Klassennamen Quelldateiname + Kt ändern möchten, verwenden Sie die Annotation @ JvmName. Diese Anmerkung ist im Paket beschrieben.

// Utility.kt
@file: JvmName("Util")
package com.sample

fun doSomething() {
    // Do something
}
// Java
Util.doSomething();

Erweiterungsfunktion

Erweiterungsfunktionen werden wie Funktionen der obersten Ebene als statische Funktionen der Klasse "Quelldateiname + Kt" kompiliert. Beim Aufruf von Java ist das Objekt, das dies wird, das erste Argument.

// StringUtility.kt
fun String.join(otherString: String) : String {
    return this + otherString
}
// Java
StringUtilityKt.join("Hello, ", "World!");

Objektklasse

Bei der Objektklasse aus Java handelt es sich um eine Klasse mit einem statischen Feld namens "INSTANCE". Um auf die Eigenschaften oder Funktionen der Objektklasse zuzugreifen, gehen Sie diese INSTANCE durch.

// Kotlin
object LogUtil {
    fun debug(log: String) {
        //
    }
}
// Java
LogUtil.INSTANCE.debug("completed!");

Beim Aufrufen von Java-Code aus Kotlin

Plattformtyp

Zum Beispiel beim Empfang des Rückgabewerts einer Java-Funktion in Kotlin-Code Ob der Rückgabewert nullbar ist oder nicht, hängt von "@ NonNull" und "@ Nullable" ab. Es wird anhand der Anmerkung beurteilt.

// Java
public class Sample {

    @NonNull
    String getString1() {
        return //
    }

    @Nullable
    String getString2() {
        return //
    }
}

Wenn man mit Kotlin anruft, sieht es so aus:

// Kotlin
val sample = Sample()
val str1 = sample.string1 //Nicht null akzeptabler Typ
val str2 = sample.string2 //null-toleranter Typ

Die Anmerkungen "@ NonNull" und "@ Nullable" Bitte beachten Sie, dass es zum Zeitpunkt der Kompilierung nicht durchsetzbar ist.

Wenn Sie also keine Anmerkungen hinzufügen ...

// Java
public class Sample {
    //Keine Anmerkung
    String getString3() {
        return  //
    }
}

Nennen wir es von Kotlin.

// Kotlin
val sample = Sample()
val str3 = sample.string3 // String!

Der Typ ist "String!". Der Typ mit ! Wird als Plattformtyp bezeichnet.

Beide Typen können sowohl nulltolerante als auch nicht nulltolerante Typen verarbeiten. Die Idee ist, es dem Entwickler zu überlassen, zu entscheiden, ob es Null ist oder nicht.

// Kotlin
val sample = Sample()
val str = sample.string3
val length = str.length //Als nicht null tolerant behandeln
val char = str?.get(0) //Als nulltoleranten Typ behandeln

statische Funktion, statisches Feld

Es kann Situationen geben, in denen Sie aus irgendeinem Grund eine statische Funktion oder ein statisches Feld benötigen. Zum Beispiel ...

Begleitobjekt, das in Kotlin wie statisch verwendet werden kann. Wenn Sie hier Anmerkungen verwenden, werden diese als Java-Statik kompiliert.

// Kotlin
class Sample {
    companion object {

        @JvmField //Eine Anmerkung, die die Kompilierung eines statischen Felds angibt
        var TAG: String = "Sample"

        @JvmStatic //Anmerkung, die die Kompilierung einer statischen Funktion angibt
        fun tag(): String {
            return "Sample"
        }
    }
}
// Java
String tag = Sample.TAG;
tag = Sample.tag();

SAM-Konvertierung

Unter bestimmten Bedingungen Sie können eine Klasse erstellen, die die Java-Schnittstelle mit einem Lambda-Ausdruck implementiert.

val executor: ThreadPoolExecutor

//Übergeben Sie ein Objekt, das Runnable als Argument der execute-Methode implementiert
executor.execute(object: Runnable{
    override fun run() {
        //
    }
})

//Es kann durch SAM-Konvertierung in einem Lambda-Ausdruck ausgedrückt werden!
executor.execute { 
    //
}

Die Bedingungen, unter denen die SAM-Konvertierung in Kotlin aktiviert ist, sind wie folgt.

Die SAM-Konvertierung ist in der in Kotlin deklarierten Schnittstelle nicht aktiviert, da in Kotlin ein geeigneter Funktionstyp vorhanden ist

Recommended Posts

Tipps zur Interoperabilität mit Kotlin zum Senden an Java-Entwickler
Kotlin-Generika für Java-Entwickler
Erste Schritte mit Kotlin zum Senden an Java-Entwickler
[Java] Tipps zum Schreiben der Quelle
Aktivieren Sie OpenCV mit Java8. (Für mich)
Java-Tipps, Tipps
Java-Tipps
Kotlins Klasse Teil 2 zum Senden an Java-Entwickler
Erste Schritte mit Ruby für Java-Ingenieure
Lernen Sie aus "Na und", den Grundlagen von Java [für Anfänger]
[Für Anfänger] Unterschied zwischen Java und Kotlin
Kotlin-Scope-Funktionen zum Senden an Java-Entwickler
Einführung in Kotlin für iOS-Entwickler lin ー Kotlin-Erstellung
[Kotlin] Doppelte Dateien löschen [Java]
Einführung in Kotlin für iOS-Entwickler ④-Typ
Memo für die Migration von Java nach Kotlin
[Java] So testen Sie, ob es in JUnit null ist
Kotlin-Funktionen und Lambdas zum Senden an Java-Entwickler
Geben Sie Optionen für die Java / Kotlin-Kompilierungszeit für Android-Apps an
Fragen Sie n Werktage später bei JAVA nach
Für JAVA-Lernen (2018-03-16-01)
Einfaches Hindernisrennen mit Java-Verarbeitung
Tipps für java.nio.file.Path
Grundeinstellungen für das Umschreiben von Java-Projekten in Kotlin
Einführung in Kotlin für iOS-Entwickler ⑤-Practical XML
2017 IDE für Java
Einführung in Kotlin für iOS-Entwickler ③-About gradle
Für Java-Ingenieure, die ab sofort Kotlin starten
Docker Container Operations mit Docker-Client API für Java
Einführung in Kotlin für iOS-Entwickler ①-Umgebungskonstruktion
Einführung in Kotlin für iOS-Entwickler ②-Projekterstellung
Tipps zum Testen mit Mock für Klassen mit @value
Java für Anweisung
CI die Architektur von Java / Kotlin-Anwendungen mit ArchUnit
Rufen Sie eine Methode mit Kotlins Rückrufblock von Java aus auf
Java-Programmierübungen für Neulinge, die bei aktiven Ingenieuren unbeliebt sind
[Java-Grundlagen] Lassen Sie uns ein Dreieck mit einer for-Anweisung erstellen
Rufen Sie den Azure App Service für die Java-Konfiguration mit System.getEnv () ab.
Generieren Sie Dummy-Daten für verschiedene Tests mit Faker (Java)
[Java] Umgebungskonstruktionsverfahren zum Entwickeln von Streben 1.3 mit Eclipse
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Versuchen Sie, mit Java eine Verbindung zu AzureCosmosDB Emulator for Docker herzustellen
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor
Installieren Sie Java mit Homebrew
[Java] für Anweisung, während Anweisung
Wechseln Sie die Plätze mit Java
Installieren Sie Java mit Ansible
[Java] Paket für die Verwaltung
[Java] für Anweisung / erweitert für Anweisung
Bequemer Download mit JAVA
Gegenmaßnahmen für OutOfMemoryError in Java
Schalten Sie Java mit direnv
[Java, Kotlin] Typabweichung
NLP für Java (NLP4J) (2)
(Memo) Java für Anweisung
Java-Download mit Ansible
Lass uns mit Java kratzen! !!
Erstellen Sie Java mit Wercker
Endian-Konvertierung mit JAVA
In Java 2D-Karte speichern und mit for-Anweisung drehen