2017-09-03 3 views
0

Wenn wir Spaß erstellt mit Kotlin wie dieseWie funktionieren Standardargument und @JvmOverloads auf Kotlin?

fun foo(bar: Int = 0, baz: Int) { /* ... */ } 

foo(baz = 1) // The default value bar = 0 is used 

So in Java müssen wir es auf diese Weise Z. B. schreiben

brauchen nicht

void foo(int bar, int baz){ 
... 
} 

void foo(int baz){ 
foo(0,baz); 
} 

des schreiben Lassen sich vorstellen, wenn wir 10+ params haben. Ich frage mich, wie Kotlin damit fertig wird. Wird Kotlin alle möglichen Methoden generieren? Oder es erzeugt nur die Methode, die der Programmierer wirklich benutzt?

Antwort

3

wird es nicht sein, 2^N Überladungen erzeugt. Wie gesagt in den docs,

für jeden Parameter mit einem Standardwert, wird dies eine weitere Überlast erzeugen, die diese Parameter und alle Parameter rechts von ihm entfernt in der Parameterliste aufweist.

Für eine Funktion mit Standardparametern, sagen wir,

fun foo(bar: Int = 1, baz: Int = 2, qux: Int = 3) { /*...*/ } 

es Überlastungen erzeugen

foo() 
foo(bar) 
foo(bar, baz) 
foo(bar, baz, qux) 
3

Vom documentation:

Weist den Kotlin Compiler Überlastungen für diese Funktion Parameterwerte, die Ersatzstandard zu erzeugen.

Wenn eine Methode hat N Parameter und M von dem Standardwert hat, sind M Überlastungen erzeugt: Die erste nimmt N-1-Parameter (alle außer die letzten, die einen Standardwert annimmt), nimmt die zweite N -2 Parameter und so weiter.

1

Wenn Sie eine Funktion mit Standardparametern haben erzeugt Kotlin eine synthetische Funktion mit den Parametern nach Bedarf und eine zusätzlichen Int als die letzten Parameter und hat einige Bit-Manipulations

Beispiel Kotlin Funktion:

fun lotsOfParameters(a: String = "Default", 
        b: Byte = 2, 
        c: Char = 'p', 
        d: Boolean = false, 
        e: Any = true, 
        f: Int = 2) { 
} 

kompilierten Java-Code:

public static final void lotsOfParameters(@NotNull String a, byte b, char c, boolean d, @NotNull Object e, int f) { 
    Intrinsics.checkParameterIsNotNull(a, "a"); 
    Intrinsics.checkParameterIsNotNull(e, "e"); 
} 

// $FF: synthetic method 
// $FF: bridge method 
public static void lotsOfParameters$default(String var0, byte var1, char var2, boolean var3, Object var4, int var5, int var6, Object var7) { 
    if ((var6 & 1) != 0) { 
    var0 = "Default"; 
    } 

    if ((var6 & 2) != 0) { 
    var1 = 2; 
    } 

    if ((var6 & 4) != 0) { 
    var2 = 'p'; 
    } 

    if ((var6 & 8) != 0) { 
    var3 = false; 
    } 

    if ((var6 & 16) != 0) { 
    var4 = true; 
    } 

    if ((var6 & 32) != 0) { 
    var5 = 2; 
    } 

    lotsOfParameters(var0, var1, var2, var3, var4, var5); 
} 
Verwandte Themen