Verhalten beim Aufrufen von Java-Argumentmethoden mit variabler Länge aus Scala / Kotlin / Java

Welcher Artikel?

Methoden mit demselben Namen in derselben Klasse Java-Klassen (kurz Klassen wie ↓), die eine Mischung aus Methoden variabler Länge und Methoden fester Länge sind Wir haben mit einem Argument untersucht, welches aufgerufen wird, wenn es von Scala / Kotlin / Java aufgerufen wird.

public class CalledClazz {
    public static void method(Object... args){
        System.out.println("Argumentmethode mit variabler Länge" + Arrays.toString(args));
    }
    public static void method(Object args){
        System.out.println("Argumentmethode mit fester Länge" + args);
    }
}

Fazit

Verhalten, wenn ein Argument übergeben wird

--Java => Grundsätzlich wird method (Object args) ausgeführt, aber in einigen Fällen wird es zu [seltsamem Verhalten](von #java aufgerufen). --Kotlin => method (Object args) wird ausgeführt --Scala => Das Argument mit variabler Länge method (Object ... args) heißt ... Also, [So rufen Sie die Java-Methode mit Argumenten mit fester Länge von Scala aus auf](# scala-Argument mit fester Länge, Java-Methode Die Aufrufmethode wurde ebenfalls untersucht.

Erhebungsmethode (Erhebungscode)

Anruf aus 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);
    }
}

Ausführungsergebnis

Argumentmethode mit fester Länge Java
Argumentmethode mit variabler Länge null
Argumentmethode mit fester Länge null
Argumentmethode mit fester Länge null

Wenn Sie null übergeben, wird es dann zum Argument variabler Länge kommen? Darüber hinaus handelt es sich nicht um ein Array vom Typ Objekt mit einem Element, sondern es wird null übergeben ... Wenn Sie eine Variable eines Typs mit null deklarieren und übergeben oder in Object umwandeln, wird eine Argumentmethode mit fester Länge erstellt ...

Anruf aus Kotlin

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

Ausführungsergebnis

Argumentmethode mit fester Länge Kotlin
Argumentmethode mit fester Länge null

Sieht nach natürlichem Verhalten aus.

Anruf von Scala

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

Ausführungsergebnis

Argumentmethode mit variabler Länge[Scala]
Argumentmethode mit variabler Länge[null]

Warum ist es ein Array und die Argumentmethode mit variabler Länge wird aufgerufen?

Aufrufen einer Java-Methode mit Argument fester Länge von Scala

val f: Object => Unit = CalledClazz.method
f("Scala")
Argumentationsmethode mit fester Länge Scala

Es kam heraus.

Auf diese Weise scheint das Deklarieren des Funktionstyps ohne Rückgriff auf Typinferenz wie beabsichtigt aufgerufen zu werden. Gibt es einen anderen Weg?

Apropos,

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

Dann wird die Methode mit dem Argument fester Länge aufgerufen und ein Wert vom Typ Tuple2 übergeben.

Argumentmethode mit fester Länge(Scala,aaaaa)

Wird rauskommen.

Bonus

Aus Scalas Sicht scheint method (Object ... args) als iterativer Parameter behandelt zu werden. Wenn Sie scala.List wie beabsichtigt an eine Java-Methode mit variabler Länge ** übergeben möchten **

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

Muss sein. Ohne es scheint es als Array mit 1 Element behandelt zu werden, mit einem Objekt namens "List (" a "," b "," b ")" als Element.

Argumentmethode mit variabler Länge[List(a, b, b)]

Wird rauskommen.

Referenzmaterial

Scala: Übergabe an wiederholte Parameter \ als Liste \ -Qiita

Recommended Posts

Verhalten beim Aufrufen von Java-Argumentmethoden mit variabler Länge aus Scala / Kotlin / Java
Versuchen Sie, synchronisierte Methoden aus mehreren Threads in Java aufzurufen
Rufen Sie die Java-API von TensorFlow von Scala aus auf
Woran ich dachte, als ich anfing, von Java nach Kotlin zu migrieren
Beim Aufrufen von println usw. aus einer externen Java-Klassendatei in Processing
Verhalten beim Tragen von Java-Anmerkungsnamen
Rufen Sie Java von C ++ auf Android NDK auf
Beim Aufrufen der API mit Java tritt eine javax.net.ssl.SSLHandshakeException auf
Vorsichtsmaßnahmen bei der Migration von VB6.0 auf JAVA
Versuchen Sie, Nim von Java über JNI aufzurufen
Memo für die Migration von Java nach Kotlin
Java-Methoden
Beim Verweisen auf Java-Klassen aus Kotlin kann es beim Erstellen zu einer ungelösten Referenz kommen
Zusammenfassung der Punkte, über die ich mir bei der Migration von Java nach Kotlin Sorgen gemacht habe
Java-Methoden
Verwenden Sie native Bibliotheken von Scala über Java CPP + Java
Migrieren Sie von Java zu Server Side Kotlin + Spring-Boot
Versuchen Sie, den CORBA-Dienst von Spring (Java) aus aufzurufen.
Erstellen Sie Scala Seq aus Java, machen Sie Scala Seq zu einer Java-Liste
Holen Sie sich Unixtime (Sekunden) von ZonedDateTime in Scala / Java
Verwenden Sie Matplotlib aus Java oder Scala mit Matplotlib4j
Überprüfen Sie das statische und öffentliche Verhalten in Java-Methoden
Was ich getan habe, als ich Java zu Kotlin konvertiert habe
Für Java-Ingenieure, die ab sofort Kotlin starten
[Java] KFunction von Method / Constructor in Java abrufen [Kotlin]