Discuss / Java / 稍微贴点方法引用

稍微贴点方法引用

Topic source

类名::实例方法这种方法引用形式,实际上是一种语法糖,它可以理解为对实例::实例方法的一种特殊情况。

使用类名::实例方法方法引用,实例:

public class Main {
    String instanceMethod(){
        return "123";
    }
   static String call(I i){
        return  i.func(new Main());
   }

    @Test
    void test() {
        System.out.println(Main.call(Main::instanceMethod));
    }
}
interface I{
    String func(Main a);
}

这种方法引用需要一个接收者参数,因此I接口的func方法需要接收一个Main类型的参数。

类似通过反射的形式调用方法:

public class Main {
    String instanceMethod(){
        return "123";
    }
    static String ref(Class<?> c,String name) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        return (String) c.getDeclaredMethod(name).invoke(new Main());
    }

    @Test
    void test() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        System.out.println(Main.ref(Main.class,"instanceMethod"));
    }
}

使用实例::实例方法方法引用,则没有隐含参数:

public class Main {
    String instanceMethod(){
        return "123";
    }
   static String call(I i){
        return  i.func();
   }

    @Test
    void test() {
        Main main = new Main();
        System.out.println(Main.call(main::instanceMethod));
    }
}
interface I{
    String func();
}

这种方法引用不需要接收者参数,因为实例本身已经确定了。


  • 1

Reply