2017-09-03 9 views
15

Kotlin में इस उदाहरण कोड देखें निम्नलिखित कोडक्यों डिफ़ॉल्ट पैरामीटर के साथ Kotlin समारोह अप्रयुक्त पैरामीटर के साथ एक विधि बनाता

public static final void foo(int bar, int baz) { 
} 

// $FF: synthetic method 
// $FF: bridge method 
public static void foo$default(int var0, int var1, int var2, Object var3) { 
    if ((var2 & 1) != 0) { 
    var0 = 0; 
    } 

    foo(var0, var1); 
} 

मैंने देखा है कि जिसके परिणामस्वरूप जावा विधि एक अप्रयुक्त Object var3 पैरामीटर है मिला है।

मैं एक तरह से सोचा था कि यह एक कक्षा में कार्यों से संबंधित हो सकता है, लेकिन जब decompiling इस कोड

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

मैं इस कोड

public final class Foo { 
    public final void foo(int bar, int baz) { 
    } 

    // $FF: synthetic method 
    // $FF: bridge method 
    public static void foo$default(Foo var0, int var1, int var2, int var3, Object var4) { 
     if ((var3 & 1) != 0) { 
     var1 = 0; 
     } 

     var0.foo(var1, var2); 
    } 
} 

मिला आप देख सकते हैं Object मानदंड अभी भी है अप्रयुक्त और बस वहाँ बैठता है। अतिरिक्त परीक्षणों पर मैंने विस्तार विधियों के लिए एक ही व्यवहार देखा। एक ही चला जाता है जब डिफ़ॉल्ट पैरामीटर पिछले (यानी fun foo(bar: Int, baz: Int = 0) {})

मैं भी क्या है कि मूल्य जब कि समारोह बुला नीचे

fun main(args: Array<String>) { 
    foo(baz = 2) 
} 

और

कोड का उपयोग करने के लिए सेट है की जाँच करने के लिए एक बुनियादी परीक्षण किया है है
class Something { 
    init { 
     foo(baz = 2) 
    } 
} 

decompiling के बाद यह मैं निम्नलिखित कोड मिल गया

public static final void main(@NotNull String[] args) { 
     Intrinsics.checkParameterIsNotNull(args, "args"); 
     foo$default(0, 2, 1, (Object)null); 
} 

और

public final class Something { 
    public Something() { 
     FooKt.foo$default(0, 2, 1, (Object)null); 
    } 
} 

जो भी कम समझ में आता है।

मेरा प्रश्न है: कोटलिन डिफ़ॉल्ट पैरामीटर के साथ फ़ंक्शंस के लिए एक अप्रयुक्त पैरामीटर क्यों उत्पन्न करता है? क्या यह एक बग है?

+0

क्या आप जब अपने डिफ़ॉल्ट पैरामीटर पिछले रहे हैं मिलता है? जैसा कि 'मजेदार foo (बार: Int, baz: int = 0) {} ' – Les

+0

@Les बस चेक किया गया है। यह वही है (यानी कि अजीब ऑब्जेक्ट var उत्पन्न होता है) – Mibac

+0

क्या आपने कॉल करने का प्रयास किया है, और जावा कोड में ऑब्जेक्ट पास किया गया है? – DPM

उत्तर

6

this के अनुसार, वर्तमान में यह अप्रयुक्त है, लेकिन बाद में डिफ़ॉल्ट के साथ सुपर कॉल जोड़ने के लिए आरक्षित है।

आप कार्रवाई यहाँ में देख सकते हैं:

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

class Blah: Foo() { 
    override fun foo(bar: Int, baz: Int) { 
    } 
} 

जो उत्पन्न होगा एक बाईटकोड करने वाली जावा Foo की:

public class Foo { 
    public void foo(int bar, int baz) { 
    } 

    // $FF: synthetic method 
    // $FF: bridge method 
    public static void foo$default(Foo var0, int var1, int var2, int var3, Object var4) { 
     if(var4 != null) { 
     throw new UnsupportedOperationException("Super calls with default arguments not supported in this target, function: foo"); 
     } else { 
     if((var3 & 1) != 0) { 
      var1 = 0; 
     } 

     var0.foo(var1, var2); 
     } 
    } 
} 
संबंधित मुद्दे