zoukankan      html  css  js  c++  java
  • 函数式接口

    函数式接口

    1. 函数式接口定义

    • 一个接口有且只有一个抽象方法。
    • 函数式接口的实例可以通过 lambda 表达式、方法引用或者构造方法引用来创建。
    注意:
    1. 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
    2. 如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口

    函数式接口应满足:

    • 该接口是一个接口类型而不是注解类型,枚举类型或类类型
    • 被声明 @FunctionalInterface 注解的接口应该满足函数式接口的定义

    如果不满足上述条件,编译器就会生成错误信息。

    1. 如果某个接口只有一个抽象方法,但我们并没有给该接口声明 @FunctionalInterface 注解,那么编译器依旧会将该接口看作是函数式接口
    重写 Object 类里的方法不会导致函数式接口失效

    ​ 如果一个接口声明了抽象方法,但该抽象方法重写了 Object 类里的一个公有方法,那么对于 Java 编译器来说,它并不会认为该方法符合函数式接口的抽象方法(即不把该方法当作函数式接口的抽象方法)。因为接口的实现类都会直接或间接继承 Object 这个根类,所以在函数式接口中定义与 Object 类中签名一样的方法是不会导致函数式接口失效的。

    举例:

    举例的接口声明为函数式接口,并重写了 toString() 这个 Object() 方法,但是并不会报错:

    @FunctionalInterface
    public interface MyInterface {
    
        void test();
    
        String toString();
    
    }
    

    2. 默认方法 default-method

    jdk1.8 以后接口里面可以定义方法的实现,这种方法叫做 default-method。

    举例:

    举个例子:forEach方法

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
    

    该实现方法定义在 Iterable 中。

    3. 静态方法 static-method

    jdk1.8 后接口也可以定义静态方法。

    举例:

    public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {
        return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;
    }
    

    4. 使用 default method 注意

    4.1 类实现接口方法

    如果接口声明了 default 方法,并且某类实现了该接口,那么 default 方法将会被继承。

    这里有个问题:

    如果有一个类继承了两个不同接口的同名 default 方法,jvm 编译器是无法识别到底该使用哪个方法的,必须重写 default 方法,如下:

    public class MyClass implements MyInterface1, MyInterface2 {
        @Override
        public void myMythod() {
            MyInterface2.super.myMethod();
        }
        
        public static void main(String[] args) {
            MyClass myClass = new MyClass();
            myClass.myMethod();
        }
    }
    

    可以重写也可以在重写方法中指定要继承接口的 default 方法。

    4.2 子类继承父类并实现接口

    实现类的优先级比接口高。

    public class MyClass extends MyInterfaceImpl implements MyInterface2 {
        
        public stativ void main(String[] args) {
            MyClass myClass = new MyClass();
            myClass.myMethod();
        }
        
    }
    

    MyInterfaceImpl 中有个和 MyInterface2 同名的 myMethod() 方法。

    运行上述代码,编译器并不会报错,因为实现类的优先级比接口高,所以 myClass.myMethod() 调用的方法默认是 MyInterfaceImpl 类中的实现方法。

  • 相关阅读:
    LeetCode 258 Add Digits
    LeetCode 231 Power of Two
    LeetCode 28 Implement strStr()
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 21 Merge Two Sorted Lists
    LeetCode 20 Valid Parentheses
    图形处理函数库 ImageTTFBBox
    php一些函数
    func_get_arg(),func_get_args()和func_num_args()的用法
    人生不是故事,人生是世故,摸爬滚打才不会辜负功名尘土
  • 原文地址:https://www.cnblogs.com/weixuqin/p/11494894.html
Copyright © 2011-2022 走看看