无法对非静态方法进行静态引用

Raj*_*udi 2 java java-8 method-reference

我阅读了教程“参考特定类型的任意对象的实例方法”。这是链接https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

所以我编写了自己的代码,但无法删除错误。 Arrays.sort(arr, String::compareToIgnoreCase);是一个合法的声明,但 Consumer m2 =Myclass::doit;给出了一个错误。如何解决这个错误?对特定类型的任意对象的实例方法的引用的概念是否适用于像 String 这样的 java 内置类?

这是我的代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

interface Myinter {
 void doit(List<String> s);
}
public class Myclass implements Myinter {
    public static void main(String[] args) {
        List<String> obj = new ArrayList<String>();
        obj.add("raj");
        obj.add("gopal");
        obj.add("bhallamudi");
        String arr[] = new String[obj.size()];
        arr = obj.toArray(arr);
        Arrays.sort(arr, String::compareToIgnoreCase);
        for (String s : arr)
            System.out.println(s + " ");

          Consumer<List<String>> m2 =Myclass::doit;
          m2.accept(obj);
    }
    @Override
    public void doit(List<String> s) {
            System.out.println(s);

    }
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 5

当您创建对实例方法的未绑定引用时,接收者实例将成为第一个函数参数。

\n\n

在 的情况下String::compareToIgnoreCase,您将有两个字符串参数传递给Comparator.compare;该方法compareToIgnoreCase将在第一个方法将第二个方法作为参数传递时被调用。

\n\n

同样,你必须使用

\n\n
BiConsumer<Myclass,List<String>> m2 = Myclass::doit;\nm2.accept(new MyClass(), obj);\n
Run Code Online (Sandbox Code Playgroud)\n\n

doit因为您可以\xe2\x80\x99t在没有 实例的情况下调用实例方法Myclass。或者,合并您的界面:

\n\n
BiConsumer<Myinter,List<String>> m2 = Myinter::doit;\nm2.accept(new MyClass(), obj);\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里,任何类实现的实例Myinter就足够了。

\n