下面的 test() 方法中有 10 个方法, 你觉得哪些调用无法通过编译?  

``` class MyRunableTest {
    @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) {

            }
        });
    }

}

```
举报· 85 次点击
登录 注册 站外分享
4 条回复  
ZZ74 小成 2024-10-7 11:00:31
除了
setMy2(new Executor2() {} 其他都过不了吧
lux182 小成 2024-10-7 11:41:40
大佬看到这 都会默默的叉掉...
chendy 小成 2024-10-7 13:52:08
完全做不出来
复制粘贴进 IDE 看了一下报错,作为一个大部分时间只会用 IDE 把 lambda 换成方法引用的菜逼,我感觉这个问题过于深奥了
spkingr 初学 2024-10-7 14:22:53
@ZZ74 是对的,楼主就是想看下方法引用怎么用,首先签名相同的接口在 lambda 中可以通用,类型自动识别,但不能用于具有多个相同签名接口的重载方法,从你下面的三个方法就看出来你的想法。
上面的方法引用应该都不合理,因为你的方法都不是静态方法,那么方法引用必然有一个 this 对象上下文,你这貌似上下文对象都不对,没法执行,你还是想测试相同签名参数的写法吧。
其实,IDEA 参数中 new 的匿名对象它能自动识别帮你转 lambda ,简单的 lambda 如果有对应的方法会自动识别帮你转方法引用,不需要担心这个。
唯一需要自己搞的就是:函数式编程中传递的方法太长,单独写成一个方法,然后使用方法引用传入既简洁又能重用。
大部分情况也还是直接干吧,有 IDEA 呢,再还有 copilot 。
返回顶部