java – 当第一个参数是具有一个方法的类时,不能用lambda替换SAM
发布时间:2020-12-15 00:41:26 所属栏目:Java 来源:网络整理
导读:我对SAM构造函数感到困惑,我有这个 Java类: public class TestSamT { public void observe(ZeroMethods zero,ObserverT observer) { } public void observe(OneMethod one,ObserverT observer) { } public void observe(TwoMethods two,ObserverT observer)
我对SAM构造函数感到困惑,我有这个
Java类:
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.),但处理所有其他情况? 此代码的基本原理是Android中的LiveData< T> .observe(LifecycleOwner所有者,Observer< T>观察者)方法,其中LifecycleOwner有一个方法getLifecycle(). 解决方法
我在编译器中找到了一条规则:如果Java方法调用需要SAM-interfaces类型,那么你可以用lambdas(或函数)替换它们,但是要么是所有这些参数,要么都不是.
所以,你有方法:public void observe(OneMethod one,Observer< T> observer). 但不是: 即使在3个或更多参数的情况下也会出现相同的行为. 对不起,如果我不是很清楚,我的英语不是很好. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |