jdk8 FunctionalInterface注解源码解读

 更新时间:2023年11月03日 10:11:36   作者:丰木  
这篇文章主要介绍了jdk8 FunctionalInterface注解源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

源码 

package java.lang;
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

Conceptually, a functional interface has exactly one abstract method.

Since default methods have an implementation, they are not abstract.

If an interface declares an abstract method overriding one of the public methods of java.lang.Object, that also does not count toward the interface's abstract method count since any implementation of the interface will have an implementation from java.lang.Object or elsewhere.

打捞要点之后有三点

  • 要声明FunctionalInterface的接口只能有1个抽象方法;

a functional interface has exactly one abstract method.

  • 因为default方法有实现,所以它也不是抽象方法, 所以不在列;
Since default methods have an implementation, they are not abstract.
  • 因为这里限定抽象方法只能有1个,那么如果我的接口里声明了一个 抽象方法"String toString();"或者"boolean equals(Object obj);"这样的,算不算呢? 答案是: 不算这个,因为任何实现接口的对象都会继承Object,所以这些public的Object的方法,不算在列的。

If an interface declares an abstract method overriding one of the public methods of java.lang.Object, that also does not count toward the interface's abstract method count since any implementation of the interface will have an implementation from java.lang.Object or elsewhere.

接口声明

也就是说,你的接口可以声名如下:

/**
 * Created by niewj on 2017/10/26.
 */
@FunctionalInterface
public interface FunctionalInterfaceSummary {
    int doSum(int x, int y); // 抽象方法
    String toString(); // 不占1的数额
    boolean equals(Object obj); // 不占1的数额
    // boolean equals(); // 占1的数额,这不是Object方法
    default void display() {
        System.out.println("show sth..");
    }
}

小结

1. 接口只限一个抽象方法,可注解@FunctionalInterface 限定;

2. 声明函数式接口之后,有以下特征:

a. 只有一个抽象方法;

b. Object类的public的方法也可以在接口里写出来,因为这不算;

c. default方法不算, 因为它们是implementation。不是abstract!

以上就是jdk8 FunctionalInterface注解源码解读的详细内容,更多关于jdk8 FunctionalInterface注解的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot Profile多环境配置方式

    SpringBoot Profile多环境配置方式

    这篇文章主要介绍了SpringBoot Profile多环境配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java枚举类使用场景及实例解析

    Java枚举类使用场景及实例解析

    这篇文章主要介绍了Java枚举类使用场景及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • JavaSE中Lambda表达式的使用与变量捕获

    JavaSE中Lambda表达式的使用与变量捕获

    这篇文章主要介绍了JavaSE中Lambda表达式的使用与变量捕获,Lambda表达式允许你通过表达式来代替功能接口, 就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体,下面我们来详细看看,需要的朋友可以参考下
    2023-10-10
  • 对spring task和线程池的深入研究

    对spring task和线程池的深入研究

    这篇文章主要介绍了对spring task和线程池的深入研究,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Springboot 使用 maven-resources-plugin 打包变量替换jar没有打包进去、Jar包没有被使用的解决方法

    Springboot 使用 maven-resources-plugin 打包变量替换ja

    这篇文章主要介绍了Springboot 使用 maven-resources-plugin 打包变量替换jar没有打包进去、Jar包没有被使用的解决方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-08-08
  • 理解Java设计模式编程中的迪米特原则

    理解Java设计模式编程中的迪米特原则

    这篇文章主要介绍了Java设计模式编程中的迪米特原则,迪米特原则旨在降低类与类之间的耦合,需要的朋友可以参考下
    2016-02-02
  • Java线程池中的工作线程Worker类源码解析

    Java线程池中的工作线程Worker类源码解析

    这篇文章主要介绍了Java线程池中的工作线程Worker类源码解析,线程池中的工作线程是通过内部类Worker表示的,Worker继承自AbstractQueueSynchronizer,可以实现同步器的功能,需要的朋友可以参考下
    2023-12-12
  • 解决springboot druid数据库连接池连接失败后一直重连问题

    解决springboot druid数据库连接池连接失败后一直重连问题

    这篇文章主要介绍了解决springboot druid数据库连接池连接失败后一直重连问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • java数据结构实现双向链表功能

    java数据结构实现双向链表功能

    这篇文章主要为大家详细介绍了java数据结构实现双向链表功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java通过What、Why、How了解弱引用

    Java通过What、Why、How了解弱引用

    这篇文章主要介绍了Java通过What、Why、How了解弱引用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论