关于 @FunctionalInterface 注解

Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。

正确例子,没有报错:

@FunctionalInterface

interface GreetingService

{

void sayMessage(String message);

}

错误例子,接口中包含了两个抽象方法,违反了函数式接口的定义,Eclipse 报错提示其不是函数式接口。

提醒:加不加 @FunctionalInterface 对于接口是不是函数式接口没有影响,该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法

函数式接口里允许定义默认方法

函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;

如下代码不会报错:

@FunctionalInterface

interface GreetingService

{

void sayMessage(String message);

default void doSomeMoreWork1()

{

// Method body

}

default void doSomeMoreWork2()

{

// Method body

}

}

函数式接口里允许定义静态方法

函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的;

如下代码不会报错:

@FunctionalInterface

interface GreetingService

{

void sayMessage(String message);

static void printHello(){

System.out.println("Hello");

}

}

函数式接口里允许定义 java.lang.Object 里的 public 方法

函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了 Object 类,包含了来自 java.lang.Object 里对这些抽象方法的实现;

如下代码不会报错:

@FunctionalInterface

interface GreetingService

{

void sayMessage(String message);

@Override

boolean equals(Object obj);

}

hezhite hezhite

152***[email protected]

参考地址

7年前 (2018-11-02)


发了工资怎么计划?工资理财分配方法与实用建议
Photoshop-填充工具