मैं हैरान सैम कंस्ट्रक्टर्स से अधिक, मैं इस जावा वर्ग है:जब पहला तर्क एक विधि के साथ एक वर्ग है लैम्ब्डा के साथ सैम-निर्माता को बदल नहीं सकता
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)
तरीका है।
क्या आप कंपाइलर स्रोत कोड के लिए एक लिंक जोड़ सकते हैं? (या एक विनिर्देश जहां इसे समझाया गया है?) (या क्या आपको इसका प्रयास करके जवाब मिल गया?) – Marco13
मुझे लगता है कि यह वास्तव में दस्तावेज नहीं है, बस मैंने कोशिश की। अधिक विशिष्ट के लिए, कोटलिन डेवलपर्स से पूछना बेहतर है। उनमें से एक ने मुझे बताया कि इसके लिए बग ट्रैकर में कोई समस्या थी। – Beholder
ओह, मुझे लगता है कि मुझे वह मिलता है। तो समस्या यह है कि मेरा 'OneMethod' और एंड्रॉइड का' लाइफसाइकिलऑनर 'एसएएम-इंटरफेस है। बहुत बुरा है कि केवल दुर्घटना से, वास्तव में, क्योंकि मुझे संदेह है कि 'लाइफसाइक्लर' का उपयोग उदाहरण के लिए 'रननेबल' के तरीके के रूप में किया जाना है, हम जावा में इसके लिए अनाम कक्षाओं को कभी परिभाषित नहीं करेंगे, इंटरफेस को 'AppCompatActivity' द्वारा कार्यान्वित किया जाता है। आधार वर्ग – arekolek