java引用类方法的一些问题


PrintString printString = new PrintString();
        usePrinter(printString::printUpper);//main方法中
private static void usePrinter(Printer p){
        p.printUpperCase("Hello World");
    //main方法所在类的另一个方法
public interface Printer {
    void printUpperCase(String s);
}//接口
public class PrintString {
    public void printUpper(String s)
    {
        String result=s.toUpperCase();
        System.out.println(result);
    }
}
//引用类方法的类

我不理解,1.为什么usePrinter中的参数是Printer而引用类方法可以直接使用,他不是PrintString类吗,参数不是要的一个接口吗?啥可以这么写
2.引用类方法的条件是什么?

不需要实现接口,这是一个语法糖,写稍微完整一点就是这样

    public static void main(String[] args) {
        PrintString printString = new PrintString();
        Consumer<String> func = printString::printUpper;
        usePrinter((s) -> {
            func.accept(s);
        });
    }

当然,本身lambda也是一个语法糖。
这就是方法引用的定义,没有什么为什么,当你的调用方式形如上方代码时,就可以使用方法引用来简化lambda。不过这样写代码可读性比较差而已,自己爽了,看你代码的人就难受了。

PrintString实现了Printer,所以子类就可以使用父类的方法和属性

代码不全吧,PrintString 没有实现接口??