gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:38:57 25 4
gpt4 key购买 nike

我对 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.),而是处理所有其他情况?


此代码的基本原理是 LiveData<T>.observe(LifecycleOwner owner, Observer<T> observer) Android 中的方法,其中 LifecycleOwner有一种方法getLifecycle() .

最佳答案

我在编译器中发现了一条规则:如果 Java 方法调用需要类型是 SAM 接口(interface),那么您可以将它们替换为 lambda(或函数),但是或者 all 此类参数,或没有

所以,你有方法:public void observe(OneMethod one, Observer<T> observer) .这两个参数都是 SAM 候选。您可以调用:
observer(object1, object2)
或:
observer(function1, function2)

不是:
observer(object1, function2)
不是:
observer(function1, object2)

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

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

关于java - 当第一个参数是具有一个方法的类时,无法用 lambda 替换 SAM 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46542037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com