java – 当第一个参数是具有一个方法的类时,不能用lambda替换SAM构造函数

前端之家收集整理的这篇文章主要介绍了java – 当第一个参数是具有一个方法的类时,不能用lambda替换SAM构造函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我对SAM构造函数感到困惑,我有这个 Java类:
  1. public class TestSam<T> {
  2.  
  3. public void observe(ZeroMethods zero,Observer<T> observer) {
  4. }
  5.  
  6. public void observe(OneMethod one,Observer<T> observer) {
  7. }
  8.  
  9. public void observe(TwoMethods two,Observer<T> observer) {
  10. }
  11.  
  12. public interface Observer<T> {
  13. void onChanged(@Nullable T t);
  14. }
  15.  
  16. public interface ZeroMethods {
  17. }
  18.  
  19. public interface OneMethod {
  20. First getFirst();
  21. }
  22.  
  23. public interface TwoMethods {
  24. First getFirst();
  25.  
  26. Second getSecond();
  27. }
  28.  
  29. public interface First {
  30. }
  31.  
  32. public interface Second {
  33. }
  34. }

而这个Kotlin代码

  1. fun testSam(
  2. test: TestSam<String>,zero: TestSam.ZeroMethods,one: TestSam.OneMethod,two: TestSam.TwoMethods
  3. ) {
  4. test.observe(zero) { println("onChanged $it") } // 1. compiles
  5. test.observe(zero,TestSam.Observer { println("onChanged $it") }) // 2. Redundant SAM-constructor
  6.  
  7. test.observe(one) { println("onChanged $it") } // 3. doesn't compile
  8. test.observe({ one.first }) { println("onChanged $it") } // 4. compiles
  9. test.observe(one,TestSam.Observer { println("onChanged $it") }) // 5. compiles
  10.  
  11. test.observe(two) { println("onChanged $it") } // 6. compiles
  12. test.observe(two,TestSam.Observer { println("onChanged $it") }) // 7. Redundant SAM-constructor
  13. }

这是什么交易?为什么Kotlin不能弄清楚3.(并提供特殊的变体4.),但处理所有其他情况?

代码的基本原理是Android中的LiveData< T> .observe(LifecycleOwner所有者,Observer< T>观察者)方法,其中LifecycleOwner有一个方法getLifecycle().

解决方法

我在编译器中找到了一条规则:如果Java方法调用需要SAM-interfaces类型,那么你可以用lambdas(或函数)替换它们,但是要么是所有这些参数,要么都不是.

所以,你有方法:public void observe(OneMethod one,Observer< T> observer).
两个参数都是SAM候选者.你可以打电话:
observer(object1,object2)
要么:
观察者(function1,function2)

但不是:
观察者(object1,function2)
并不是:
观察者(function1,object2)

即使在3个或更多参数的情况下也会出现相同的行为.
造成这种情况的原因是编译器设计中的技术难度.

对不起,如果我不是很清楚,我的英语不是很好.

猜你在找的Java相关文章