7

मैं हैरान सैम कंस्ट्रक्टर्स से अधिक, मैं इस जावा वर्ग है:जब पहला तर्क एक विधि के साथ एक वर्ग है लैम्ब्डा के साथ सैम-निर्माता को बदल नहीं सकता

public class TestSam<T> { 

    public void observe(ZeroMethods zero, Observer<T> observer) { 
    } 

    public void observe(OneMethod one, Observer<T> observer) { 
    } 

    public void observe(TwoMethods two, Observer<T> observer) { 
    } 

    public interface Observer<T> { 
     void onChanged(@Nullable T t); 
    } 

    public interface ZeroMethods { 
    } 

    public interface OneMethod { 
     First getFirst(); 
    } 

    public interface TwoMethods { 
     First getFirst(); 

     Second getSecond(); 
    } 

    public interface First { 
    } 

    public interface Second { 
    } 
} 

और यह Kotlin कोड:

fun testSam(
     test: TestSam<String>, 
     zero: TestSam.ZeroMethods, 
     one: TestSam.OneMethod, 
     two: TestSam.TwoMethods 
) { 
    test.observe(zero) { println("onChanged $it") } // 1. compiles 
    test.observe(zero, TestSam.Observer { println("onChanged $it") }) // 2. Redundant SAM-constructor 

    test.observe(one) { println("onChanged $it") } // 3. doesn't compile 
    test.observe({ one.first }) { println("onChanged $it") } // 4. compiles 
    test.observe(one, TestSam.Observer { println("onChanged $it") }) // 5. compiles 

    test.observe(two) { println("onChanged $it") } // 6. compiles 
    test.observe(two, TestSam.Observer { println("onChanged $it") }) // 7. Redundant SAM-constructor 
} 

यहां क्या सौदा है? Kotlin क्यों नहीं पता कर सकते हैं 3. (और विशेष संस्करण प्रदान करता है 4.), लेकिन सभी अन्य मामलों को संभालती है?


इस कोड के लिए तर्क एंड्रॉयड, जहां LifecycleOwner एक विधि getLifecycle() है में LiveData<T>.observe(LifecycleOwner owner, Observer<T> observer) तरीका है।

उत्तर

2

मैं संकलक में एक नियम पाया: जावा विधि कॉल प्रकार जो सैम-इंटरफेस है की आवश्यकता है, तो आप उन्हें lambdas (या कार्यों) के साथ की जगह ले सकता है, लेकिन या तो सभी इस तरह के मानकों, या कोई भी उनमें से।

तो, आपके पास विधि है: public void observe(OneMethod one, Observer<T> observer)। दोनों पैरामीटर एसएएम उम्मीदवार हैं। आप कॉल कर सकते हैं:
observer(object1, object2)
या:
observer(function1, function2)

लेकिन नहीं:
observer(object1, function2)
और नहीं:
observer(function1, object2)

एक ही व्यवहार भी 3 या के मामले में हो जाएगा अधिक पैरामीटर इसका कारण संकलक डिजाइन में तकनीकी कठिनाई है।

क्षमा करें अगर मैं बहुत स्पष्ट नहीं हूं, तो मैं अंग्रेजी में बहुत अच्छा नहीं हूं।

+0

क्या आप कंपाइलर स्रोत कोड के लिए एक लिंक जोड़ सकते हैं? (या एक विनिर्देश जहां इसे समझाया गया है?) (या क्या आपको इसका प्रयास करके जवाब मिल गया?) – Marco13

+0

मुझे लगता है कि यह वास्तव में दस्तावेज नहीं है, बस मैंने कोशिश की। अधिक विशिष्ट के लिए, कोटलिन डेवलपर्स से पूछना बेहतर है। उनमें से एक ने मुझे बताया कि इसके लिए बग ट्रैकर में कोई समस्या थी। – Beholder

+0

ओह, मुझे लगता है कि मुझे वह मिलता है। तो समस्या यह है कि मेरा 'OneMethod' और एंड्रॉइड का' लाइफसाइकिलऑनर 'एसएएम-इंटरफेस है। बहुत बुरा है कि केवल दुर्घटना से, वास्तव में, क्योंकि मुझे संदेह है कि 'लाइफसाइक्लर' का उपयोग उदाहरण के लिए 'रननेबल' के तरीके के रूप में किया जाना है, हम जावा में इसके लिए अनाम कक्षाओं को कभी परिभाषित नहीं करेंगे, इंटरफेस को 'AppCompatActivity' द्वारा कार्यान्वित किया जाता है। आधार वर्ग – arekolek

संबंधित मुद्दे

 संबंधित मुद्दे