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