Conseils d'interopérabilité avec Kotlin à envoyer aux développeurs Java

Lors de l'appel de code Kotlin depuis Java

Argument par défaut

Si vous souhaitez gérer les fonctions de Kotlin avec des arguments par défaut de Java, vous devez spécifier tous les arguments. Cependant, si vous ajoutez l'annotation @ JvmOverload à la fonction, la méthode de surcharge sera générée automatiquement.

// Kotlin
class OverloadSample {
    @JvmOverloads //L'annotation générera une méthode surchargée qui peut être appelée à partir de Java
    fun test(arg1: Boolean = true, arg2: Int = 1, arg3: String = "true") : Boolean {
        return arg1 && arg2 == 1 && arg3 == "true"
    }
}

Implémentons le code d'appel de Java.

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

Fonctions de haut niveau, propriétés

Comment appeler des fonctions Kotlin de premier niveau qui n'appartiennent pas à une classe depuis Java. Fonctions de haut niveau de Kotlin Une classe nommée nom du fichier source + Kt est générée Il sera compilé dans une fonction statique de cette classe.

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

Si vous souhaitez modifier le nom de classe ci-dessus nom du fichier source + Kt, utilisez l'annotation @ JvmName. Cette annotation est décrite dans le package.

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

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

Fonction d'extension

Les fonctions d'extension, comme les fonctions de niveau supérieur, sont compilées comme des fonctions statiques de la classe nommée nom du fichier source + Kt. Lors d'un appel depuis Java, l'objet qui devient ceci est le premier argument.

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

classe d'objets

En regardant la classe d'objet de Java, c'est une classe avec un champ statique appelé ʻINSTANCE. Pour accéder aux propriétés ou fonctions de la classe d'objets, parcourez cette ʻINSTANCE.

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

Lors de l'appel de code Java depuis Kotlin

Type de plateforme

Par exemple, lors de la réception de la valeur de retour d'une fonction Java dans le code Kotlin Le fait que la valeur de retour soit tolérante à null ou non dépend de @ NonNull et @ Nullable. Il est jugé par l'annotation.

// Java
public class Sample {

    @NonNull
    String getString1() {
        return //
    }

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

Lorsqu'il est appelé avec Kotlin, cela ressemble à ceci:

// Kotlin
val sample = Sample()
val str1 = sample.string1 //Type acceptable non nul
val str2 = sample.string2 //type à tolérance nulle

Cependant, les annotations @ NonNull et @ Nullable Veuillez noter qu'il n'est pas exécutoire au moment de la compilation.

Donc, si vous n'ajoutez pas d'annotations ...

// Java
public class Sample {
    //Aucune annotation
    String getString3() {
        return  //
    }
}

Appelons-le de Kotlin.

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

Le type est "String!". Le type avec ! Est appelé le type de plate-forme.

Les deux types peuvent gérer à la fois les types tolérants à zéro et non tolérants à zéro. L'idée est de laisser au développeur le soin de décider si c'est Null ou non.

// Kotlin
val sample = Sample()
val str = sample.string3
val length = str.length //Traiter comme tolérant non nul
val char = str?.get(0) //Traiter comme un type à tolérance nulle

fonction statique, champ statique

Il peut y avoir des situations où vous avez besoin d'une fonction ou d'un champ statique pour une raison quelconque. Par exemple ...

Objet compagnon qui peut être utilisé comme statique dans Kotlin. Si vous utilisez des annotations ici, elles seront compilées en Java statique.

// Kotlin
class Sample {
    companion object {

        @JvmField //Une annotation qui spécifie la compilation dans un champ statique
        var TAG: String = "Sample"

        @JvmStatic //Annotation qui spécifie la compilation vers une fonction statique
        fun tag(): String {
            return "Sample"
        }
    }
}
// Java
String tag = Sample.TAG;
tag = Sample.tag();

Conversion SAM

Sous certaines conditions Vous pouvez créer une classe qui implémente l'interface Java avec une expression lambda.

val executor: ThreadPoolExecutor

//Passer un objet qui implémente Runnable comme argument de la méthode execute
executor.execute(object: Runnable{
    override fun run() {
        //
    }
})

//Il peut être exprimé dans une expression lambda par conversion SAM!
executor.execute { 
    //
}

Les conditions dans lesquelles la conversion SAM est activée dans Kotlin sont les suivantes.

La conversion SAM n'est pas activée dans l'interface déclarée dans Kotlin car il existe un type de fonction approprié dans Kotlin

Recommended Posts

Conseils d'interopérabilité avec Kotlin à envoyer aux développeurs Java
Génériques Kotlin pour les développeurs Java
Premiers pas avec Kotlin à envoyer aux développeurs Java
[Java] Conseils pour l'écriture de la source
Activez OpenCV avec java8. (Pour moi-même)
Astuces Java, astuces
Astuces Java
Kotlin's Class part.2 à envoyer aux développeurs Java
Premiers pas avec Ruby pour les ingénieurs Java
Apprenez de «Et alors», les bases de Java [pour les débutants]
[Pour les débutants] Différence entre Java et Kotlin
Fonctions de portée Kotlin à envoyer aux développeurs Java
Introduction à kotlin pour les développeurs iOS ⑥ ー création de kotlin
[Kotlin] Supprimer les fichiers en double [Java]
Introduction à kotlin pour les développeurs iOS ④-type
Mémo pour la migration de Java vers Kotlin
[Java] Comment tester s'il est nul dans JUnit
Fonctions Kotlin et lambdas à envoyer aux développeurs Java
Spécifier les options de compilation Java / Kotlin pour les applications Android
Demandez n jours ouvrables plus tard avec JAVA
Pour l'apprentissage JAVA (2018-03-16-01)
Course d'obstacles facile avec traitement pour Java
astuces pour java.nio.file.Path
Paramètres initiaux pour la réécriture de projets Java sur Kotlin
Introduction à kotlin pour les développeurs iOS ⑤-XML pratique
IDE 2017 pour Java
Introduction à kotlin pour les développeurs iOS ③-À propos de gradle
Pour les ingénieurs Java qui démarrent Kotlin à partir de maintenant
Opérations de conteneur Docker avec l'API Docker-Client pour Java
Introduction à kotlin pour les développeurs iOS ①-Construction de l'environnement
Introduction à kotlin pour les développeurs iOS ②-Création de projet
Conseils pour tester avec mock pour les classes utilisant @value
Java pour instruction
CI l'architecture des applications Java / Kotlin avec ArchUnit
Appeler une méthode avec le bloc de rappel de Kotlin depuis Java
Exercices de programmation Java pour les nouveaux arrivants impopulaires auprès des ingénieurs actifs
[Bases de Java] Créons un triangle avec une instruction for
Obtenez la configuration Azure App Service pour Java avec System.getEnv ()
Générer des données factices pour divers tests avec Faker (java)
[Java] Procédure de construction de l'environnement pour le développement de struts 1.3 avec Eclipse
Je veux faire des transitions d'écran avec kotlin et java!
Essayez de vous connecter à l'émulateur AzureCosmosDB pour Docker avec Java
Préparer l'environnement pour java11 et javaFx avec Ubuntu 18.4
Installez java avec Homebrew
[Java] pour instruction, while instruction
Changer de siège avec Java
Installez Java avec Ansible
[Java] Package de gestion
[Java] pour instruction / étendu pour instruction
Téléchargement confortable avec JAVA
Contre-mesures pour OutOfMemoryError en java
Changer java avec direnv
[Java, Kotlin] Variance de type
PNL pour Java (NLP4J) (2)
(Mémo) Java pour instruction
Téléchargement Java avec Ansible
Raclons avec Java! !!
Construire Java avec Wercker
Conversion Endian avec JAVA
Stocker dans une carte Java 2D et tourner avec pour instruction