FunctionalInterface中abstract关键字是否用于区分lambda对应的抽象方法?
你的认知是错误的,相关逻辑如下:
核心规则澄清
- 接口中所有非默认、非静态、无方法体的方法,默认自带
public abstract修饰,手动写abstract属于冗余操作,不会改变方法本身的抽象属性,也没有任何特殊标记作用。 - 函数式接口的唯一判定标准是:接口内有且仅有1个抽象方法(排除继承自
java.lang.Object的公共方法、接口默认方法、静态方法),和方法是否手动加了abstract修饰符没有任何关系。
针对你的示例逐一说明
- 第一个单方法接口是合法的函数式接口,符合单抽象方法的要求。
public interface AllTrades { public boolean checkSalary(ATrade t); }
- 新增第二个抽象方法后,接口已经存在2个抽象方法,无论如何调整修饰符都不可能再成为合法的函数式接口:
public interface AllTrades { public boolean checkSalary(ATrade t); public boolean checkSalary2(ATrade t); }
- 你给其中一个方法手动加
abstract的写法完全不会改变结果,两个方法仍然都是抽象方法,该接口依然不满足函数式接口的要求:
public interface AllTrades { abstract public boolean checkSalary(ATrade t); public boolean checkSalary2(ATrade t); }
常见误区补充
函数式接口之所以能绑定Lambda表达式,核心是因为只有一个抽象方法,Lambda的参数、返回值可以和这个唯一的方法自动匹配,根本不存在“多个抽象方法里选一个作为承载”的场景,自然也不需要额外的关键字做标记。如果你给接口加了@FunctionalInterface注解,编译器会主动校验抽象方法数量,上述有2个抽象方法的接口会直接报编译错误。
内容的提问来源于stack exchange,提问作者likejudo
相关产品推荐
相关产品推荐

