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);
}
}
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.
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 ...
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.
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?
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.
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.
Scala: Übergabe an wiederholte Parameter \ als Liste \ -Qiita
Recommended Posts