Comportement lors de l'appel des méthodes d'argument de longueur variable Java à partir de Scala / Kotlin / Java

Quel article?

Méthodes avec le même nom dans la même classe Les classes Java (en bref, des classes comme ↓) qui sont un mélange de méthodes de longueur variable et de méthodes de longueur fixe Nous avons étudié lequel est appelé lorsqu'il est appelé depuis Scala / Kotlin / Java avec un argument.

public class CalledClazz {
    public static void method(Object... args){
        System.out.println("Méthode d'argument de longueur variable" + Arrays.toString(args));
    }
    public static void method(Object args){
        System.out.println("Méthode d'argument de longueur fixe" + args);
    }
}

Conclusion

Comportement lorsqu'un argument est passé

--Java => Fondamentalement, method (Object args) est exécuté, mais dans certains cas il devient [comportement étrange](appelé depuis #java). --Kotlin => méthode (Object args) est exécutée --Scala => L'argument de longueur variable method (Object ... args) est appelé ... Donc, [Comment appeler la méthode Java de l'argument de longueur fixe depuis Scala](La méthode java de l'argument de longueur fixe de #scala) La méthode d'appel) a également été examinée.

Méthode d'enquête (code d'enquête)

Appel de Java

public class JavaClazz {
    public static void main(String... args) throws IOException {
        CalledClazz.method("Java");
        CalledClazz.method(null);
        Object s = null;
        CalledClazz.method(s);
        CalledClazz.method((Object)null);
    }
}

Résultat d'exécution

Méthode d'argument de longueur fixe Java
Méthode d'argument de longueur variable null
Méthode d'argument de longueur fixe null
Méthode d'argument de longueur fixe null

Si vous passez null, en viendra-t-il à l'argument de longueur variable? De plus, ce n'est pas un tableau de type Object avec un élément, mais null est passé ... De plus, si vous déclarez une variable d'un type quelconque avec null et la transmettez, ou la convertissez en Object, elle aboutira à une méthode d'argument de longueur fixe ...

Appel de Kotlin

fun main() {
    CalledClazz.method("Kotlin")
    CalledClazz.method(null)
}

Résultat d'exécution

Méthode d'argument de longueur fixe Kotlin
Méthode d'argument de longueur fixe null

On dirait un comportement naturel.

Appel de Scala

object CallTestByScala extends App {
  CalledClazz.method("Scala")
  CalledClazz.method(null)
}

Résultat d'exécution

Méthode d'argument de longueur variable[Scala]
Méthode d'argument de longueur variable[null]

Pourquoi est-ce un tableau et la méthode d'argument de longueur variable est appelée?

Comment appeler une méthode Java d'argument de longueur fixe à partir de Scala

val f: Object => Unit = CalledClazz.method
f("Scala")
Méthode d'argument de longueur fixe Scala

Il est venu pour sortir.

De cette manière, déclarer le type d'une fonction sans s'appuyer sur l'inférence de type semble être appelé comme prévu. Est-ce qu'il y a un autre moyen?

Au fait,

val f: Object => Unit = CalledClazz.method
f("Scala", "aaaaa")

Ensuite, la méthode avec un argument de longueur fixe est appelée et une valeur de type Tuple2 est transmise.

Méthode d'argument de longueur fixe(Scala,aaaaa)

Sortira.

Prime

Du point de vue de Scala, «method (Object ... args)» semble être traitée comme un paramètre itératif. Si vous voulez passer scala.List à une méthode de longueur variable Java ** comme prévu **

CalledClazz.method(List("a","b","b"): _*)

Doit être. Sans lui, il semble être traité comme un tableau avec 1 élément, avec un objet appelé `List (" a "," b "," b ") ʻen tant qu'élément.

Méthode d'argument de longueur variable[List(a, b, b)]

Sortira.

Matériel de référence

Scala: Comment passer aux paramètres répétés \ comme une liste \ -Qiita

Recommended Posts

Comportement lors de l'appel des méthodes d'argument de longueur variable Java à partir de Scala / Kotlin / Java
Essayez d'appeler des méthodes synchronisées à partir de plusieurs threads en Java
Appelez l'API Java de TensorFlow depuis Scala
Ce à quoi j'ai pensé lorsque j'ai commencé à migrer de Java vers Kotlin
Lors de l'appel de println etc. à partir d'un fichier de classe Java externe en traitement
Comportement lorsque les noms d'annotation Java sont portés
Appeler java depuis C ++ sur Android NDK
Lors de l'appel de l'API avec java, javax.net.ssl.SSLHandshakeException se produit
Précautions lors de la migration de VB6.0 vers JAVA
Essayez d'appeler Nim depuis Java via JNI
Mémo pour la migration de Java vers Kotlin
Méthodes Java
Une référence non résolue peut se produire au moment de la construction lors du référencement des classes Java à partir de Kotlin
Résumé des points qui m'inquiétaient lors de la migration de Java vers Kotlin
Méthodes Java
Utiliser les bibliothèques natives de Scala via Java CPP + Java
Migrer de Java vers Kotlin côté serveur + Spring-boot
Essayez d'appeler le service CORBA depuis Spring (Java)
Créer Scala Seq à partir de Java, faire de Scala Seq une liste Java
Obtenez unixtime (secondes) de ZonedDateTime dans Scala / Java
Utilisez Matplotlib depuis Java ou Scala avec Matplotlib4j
Vérifier le comportement statique et public dans les méthodes Java
Ce que j'ai fait lorsque j'ai converti Java en Kotlin
Pour les ingénieurs Java qui démarrent Kotlin à partir de maintenant
[Java] Obtenir KFunction à partir de la méthode / du constructeur en Java [Kotlin]