Java中Consumer接口使用疑问:方法引用报错及等价性咨询
问题解答
1. 为何Mathod::nonStaticMethod作为Lambda主体会报“void is not a functional Interface”?
你的代码Consumer nonStaticConsumer = () -> Mathod::nonStaticMethod;存在两个核心问题:
- 类型不匹配:
Consumer的抽象方法accept(T t)要求Lambda主体是执行无返回值的操作,但你写的() -> Mathod::nonStaticMethod是返回一个方法引用实例,而非执行方法,和Consumer的方法签名完全不兼容。 - 非静态方法引用使用错误:
Mathod::nonStaticMethod这种类名引用非静态方法的写法,本质等价于(Mathod m) -> m.nonStaticMethod(),对应的函数式接口是Consumer<Mathod>(接收一个Mathod实例并调用方法);如果要直接引用某个实例的非静态方法,需先创建实例再引用,比如:Mathod mathod = new Mathod(); // nonStaticMethod无参且返回void,对应Runnable接口 Runnable nonStaticRunnable = mathod::nonStaticMethod; nonStaticRunnable.run(); // 此时才会执行方法
2. mathod::nonStaticMethod;为何提示“Error: Not a statement”?
方法引用是表达式,不是可独立执行的语句,不能单独写在一行。你必须把它赋值给兼容的函数式接口变量,或者作为参数传递给需要函数式接口的方法。正确用法示例:
Mathod mathod = new Mathod(); // 赋值给Runnable变量后调用run()执行方法 Runnable runnable = mathod::nonStaticMethod; runnable.run(); // 或者直接转换为接口并调用 ((Runnable) mathod::nonStaticMethod).run();
3. mathod.nonStaticMethod();与mathod::nonStaticMethod是否等价?
完全不等价:
mathod.nonStaticMethod();是直接调用方法,执行方法体中的代码,是可独立执行的语句,调用后立刻输出内容。mathod::nonStaticMethod是方法引用,它只是指向该实例方法的“引用对象”(本质是函数式接口的实例),本身不会执行方法,只有调用该函数式接口的抽象方法(比如Runnable.run())时,才会触发nonStaticMethod的执行。
内容的提问来源于stack exchange,提问作者Juicy Jay
相关产品推荐
相关产品推荐

