2017-09-03 69 views
0

當我們與科特林創造的樂趣這樣默認參數和@JvmOverloads如何在Kotlin上工作?

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

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

所以在Java中,我們需要把它這樣寫 例如

不需要寫

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

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

我們,如果我們有10+ PARAMS的想象。我想知道Kotlin如何處理這件事。 Kotlin會生成所有可能的方法嗎?或者它只是產生程序員真正使用的方法?

回答

3

不會有產生2^N次重載。正如docs

說,對於有默認值的每個參數,這將產生一個額外的過載,它有這個參數,所有參數到它在去除參數列表的權利。

對於默認參數,比如說一個功能,

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

它會產生過載

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

documentation

指示科特林編譯器生成重載這個函數 是替代默認參數值。

如果方法有N個參數,其中M有默認值,則會生成M 過載:第一個參數取N-1個參數(除最後一個參數外均爲默認值),第二個取N -2 參數等。

1

當你有具有默認參數的函數科特林產生具有所要求的參數和一個附加Int作爲最後的參數的合成功能和做一些位操作

例科特林功能:

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

編譯Java代碼:

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