我对SAM构造函数感到困惑,我有这个
Java类:
public class TestSam {
public void observe(ZeroMethods zero,Observer observer) {
}
public void observe(OneMethod one,Observer observer) {
}
public void observe(TwoMethods two,Observer observer) {
}
public interface Observer {
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,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.),但处理所有其他情况?
此代码的基本原理是Android中的LiveData< T> .observe(LifecycleOwner所有者,Observer< T>观察者)方法,其中LifecycleOwner有一个方法getLifecycle().