Discuss / Java / 方法引用,引用一个非静态方法时,应该加一个new关键字吧

方法引用,引用一个非静态方法时,应该加一个new关键字吧

Topic source

我也晕了。

应该是:

如果你定义的是实例方法CompareTo(Object o),那么它有隐含参数this。另外如果把你上面那个改称实例方法CompareTo(Object o),也无法传入Main::CompareTo,因为this所指向的实例是Main类,而Comparator<String>里的compareTo需要的参数是String类。

那个方法调用是这个东西的简写

public class Program {    public static void main(String[] args) {        String[] array = new String[]{"apple", "orange", "banana", "lemon"};        Arrays.sort(array, (s1,s2)-> s1.compareTo(s2));        System.out.println(String.join(", ", array));    }}

您的代码我运行了,如果方法引用引用的是实例方法,且新实例方法参数签名与原有方法参数签名一致的话,需要。

new Main()::compareTo

您的讨论不在老师教程范围里面,属于引用实例方法但参数签名一致的情况。

🌙

#15 Created at ... [Delete] [Delete and Lock User]

类名 :: 实例方法名

的语法,搞明白了 就懂了

alienation

#16 Created at ... [Delete] [Delete and Lock User]

问题不错,搞懂了,静态方法直接对类进行引用,实例方法对实例引用,如果被引用方法不加static声明的话就需要在引用时创建一个实例再引用方法。

pengll

#17 Created at ... [Delete] [Delete and Lock User]
public class Main {    static int cmp(String s1, String s2) {        return s1.compareTo(s2);    }    public int compareTo(String s1, String s2) {        return s1.toLowerCase().compareTo(s2.toLowerCase());    }    public static void main(String[] args) {        String[] array = new String[] { "apple", "Orange", "banana", "Lemon" };        Arrays.sort(array, (o1, o2) ->                //官方文档把实例方法引用分为未绑定方法引用和绑定方法引用                //  未绑定方法引用:调用方法的实例是入参的情况,语法格式:(arg0, rest) -> arg0.instanceMethod(rest)和RefType::instanceMethod                //  绑定方法引用:调用方法的实例是在实现接口方法体内部创建的,语法格式:(args) -> expr.instanceMethod(args)和expr::instanceMethod                //1.调用compareTo()方法的是入参o1,所以可以写成String::compareTo                o1.compareTo(o2)                //2.调用compareTo()方法的是表达式new Main(),所以要写成new Main()::compareTo//             new Main().compareTo(o1, o2)                //3.静态方法引用是 RefType::staticMethod和(args) -> RefType.staticMethod(args),所以写成Main::cmp//             Main.cmp(o1, o2)        );        System.out.println(String.join(", ", array));    }}

pengll

#18 Created at ... [Delete] [Delete and Lock User]

官方文档把实例方法引用分为 未绑定方法引用绑定方法引用静态方法引用

public class Main {

    static int cmp(String s1, String s2) {
        return s1.compareTo(s2);
    }

    public int compareTo(String s1, String s2) {
        return s1.toLowerCase().compareTo(s2.toLowerCase());
    }

    public static void main(String[] args) {
        String[] array = new String[] { "apple", "Orange", "banana", "Lemon" };
        
        // 1.未绑定方法引用:调用方法的实例是入参的情况,语法格式:(arg0, rest) -> arg0.instanceMethod(rest) 可以简写为 RefType::instanceMethod     
        Arrays.sort(array, (o1, o2) -> o1.compareTo(o2));
        Arrays.sort(array, String::compareTo);
        
        // 2.绑定方法引用:调用方法的实例是在实现接口方法体内部创建的,语法格式:(args) -> expr.instanceMethod(args) 可以简写为 expr::instanceMethod 
        Arrays.sort(array, (o1, o2) -> new Main().compareTo(o1, o2));
        Arrays.sort(array, new Main()::compareTo);
        
        // 3.静态方法引用是(args) -> RefType.staticMethod(args) 可以简写为 RefType::staticMethod
        Arrays.sort(array, (o1, o2) -> Main.cmp(o1, o2));
        Arrays.sort(array, Main::cmp);
    }
}

星星

#19 Created at ... [Delete] [Delete and Lock User]

String[] array = new String[] { "Apple", "Orange", "Banana", "Lemon" };

Arrays.sort(array, String::compareTo);

第一行代码不是已经new 过了吗?这里的compareTo就是调用数组里面字符串对应的compareTo函数阿。

public static  void main()

{

....

}

有没有可能你需要new Main是因为你在一个静态函数里面去访问实例的非静态方法呢?

静态函数可没有this指向的实例阿。你想要在静态函数里访问实例的非静态方法可不得new一个。


  • 1
  • 2

Reply