V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jeesk
V2EX  ›  Java

Java 大佬们 ,来来来做题了? 看看是否能够在心里直接做出来。

  •  
  •   jeesk · 78 天前 · 2219 次点击
    这是一个创建于 78 天前的主题,其中的信息可能已经有所发展或是发生改变。

    下面的 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) {
    
                }
            });
        }
    
    }
    
    
    4 条回复    2024-10-07 14:22:53 +08:00
    ZZ74
        1
    ZZ74  
       77 天前
    除了
    setMy2(new Executor2() {} 其他都过不了吧
    lux182
        2
    lux182  
       77 天前
    大佬看到这 都会默默的叉掉...
    chendy
        3
    chendy  
       77 天前
    完全做不出来
    复制粘贴进 IDE 看了一下报错,作为一个大部分时间只会用 IDE 把 lambda 换成方法引用的菜逼,我感觉这个问题过于深奥了
    spkingr
        4
    spkingr  
       77 天前 via Android
    @ZZ74 是对的,楼主就是想看下方法引用怎么用,首先签名相同的接口在 lambda 中可以通用,类型自动识别,但不能用于具有多个相同签名接口的重载方法,从你下面的三个方法就看出来你的想法。
    上面的方法引用应该都不合理,因为你的方法都不是静态方法,那么方法引用必然有一个 this 对象上下文,你这貌似上下文对象都不对,没法执行,你还是想测试相同签名参数的写法吧。
    其实,IDEA 参数中 new 的匿名对象它能自动识别帮你转 lambda ,简单的 lambda 如果有对应的方法会自动识别帮你转方法引用,不需要担心这个。
    唯一需要自己搞的就是:函数式编程中传递的方法太长,单独写成一个方法,然后使用方法引用传入既简洁又能重用。
    大部分情况也还是直接干吧,有 IDEA 呢,再还有 copilot 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1132 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 18:42 · PVG 02:42 · LAX 10:42 · JFK 13:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.