为什么在Java 8中将@FunctionalInterface注释添加到Comparator接口?

我理解使用Java 8的default关键字添加了一堆带body的方法。我的问题是这个注释在哪里有用? 我看到只允许使用这样的注释添加一个抽象方法。 但比较器有两种抽象方法:

  • int compare(T o1, T o2);
  • boolean equals(Object obj);

另外,请解释一下这个注释的用法? 我看到它是一个运行时注释,那么它的用途是什么?

FunctionalInterface的文档 :

如果接口声明了一个覆盖java.lang.Object的公共方法之一的抽象方法,那么它也不会计入接口的抽象方法计数,因为接口的任何实现都将具有java.lang.Object或其他地方的实现。

由于equals来自java.lang.Object ,因此不计算在内。 它是与FunctionInterface相关的compare方法。

它很有用,因为如果你添加它并且在接口中有多个方法,你将收到编译错误。 @FunctionalInterface用于让Java知道这段代码可能被lambda表达式替换,因为每个lambda都是@FunctionalInterface一个实现。 它有助于编译器知道方法签名是什么。