下面的 test() 方法中有 10 个方法, 你觉得哪些调用无法通过编译?
@FunctionalInterface
public interface Executor1 {
void execute(Runable1 command);
}
@FunctionalInterface
public interface Executor2 extends Executor{
void execute(Runnable command);
}
@FunctionalInterface
public interface Executor3 extends Executor2{
void execute(Runnable command);
}
public void setMy(Executor e){
}
public void setMy1(Executor1 e){
}
public void setMy2(Executor2 e){
}
@FunctionalInterface
public interface Runable1 extends Runnable{
}
@FunctionalInterface
public interface Runable2 extends Runable1{
}
public void test(){
setMy(Runnable::run);
setMy(Runable1::run);
setMy1(Runnable::run);
setMy1(Runable1::run);
setMy1(Runable2::run);
setMy2(Runnable::run);
setMy2(Runable1::run);
setMy2(new Executor3() {
@Override
public void execute(Runnable command) {
}
});
setMy2(new Executor() {
@Override
public void execute(Runnable command) {
}
});
setMy2(new Executor2() {
@Override
public void execute(Runnable command) {
}
});
}
}
1
ZZ74 55 天前
除了
setMy2(new Executor2() {} 其他都过不了吧 |
2
lux182 55 天前
大佬看到这 都会默默的叉掉...
|
3
chendy 55 天前
完全做不出来
复制粘贴进 IDE 看了一下报错,作为一个大部分时间只会用 IDE 把 lambda 换成方法引用的菜逼,我感觉这个问题过于深奥了 |
4
spkingr 55 天前 via Android
@ZZ74 是对的,楼主就是想看下方法引用怎么用,首先签名相同的接口在 lambda 中可以通用,类型自动识别,但不能用于具有多个相同签名接口的重载方法,从你下面的三个方法就看出来你的想法。
上面的方法引用应该都不合理,因为你的方法都不是静态方法,那么方法引用必然有一个 this 对象上下文,你这貌似上下文对象都不对,没法执行,你还是想测试相同签名参数的写法吧。 其实,IDEA 参数中 new 的匿名对象它能自动识别帮你转 lambda ,简单的 lambda 如果有对应的方法会自动识别帮你转方法引用,不需要担心这个。 唯一需要自己搞的就是:函数式编程中传递的方法太长,单独写成一个方法,然后使用方法引用传入既简洁又能重用。 大部分情况也还是直接干吧,有 IDEA 呢,再还有 copilot 。 |