【问题标题】:Java 8 FunctionalInterface and InterfaceJava 8 功能接口和接口
【发布时间】:2021-02-15 06:33:01
【问题描述】:

大家好。 FunctionInterfaceInterface 有什么区别,为什么我们需要声明 @FunctionalInterface 如果我们在这个包的实现中有接口java.util.function;

【问题讨论】:

  • 功能接口是任何只包含一个抽象方法的接口,但它可能包含一个或多个默认方法或静态方法。你应该学习docs.oracle.com/javase/tutorial/java/javaOO/…
  • @FunctionalInterface 注释严格来说是信息性的:从来没有必要使用它。 Java 编译器可以识别有或没有@FunctionInterface 的功能接口。现在只是推测,但可能@FunctionInterface 导致 Javadoc 插入简介 "Functional Interface: 这是一个功能接口,因此可以用作 lambda 表达式或方法引用的赋值目标.”在方法的 Javadoc 页面的标题中。

标签: java lambda java-8


【解决方案1】:

FunctionalInterface 是一个接口:

  • 只有一种抽象方法。
  • 零个或多个默认方法(带正文)。

因此,编译器将能够找到与您将传递的 lambda 对应的方法。

例如;

@FunctionalInterface
public interface Supplier<T> {
    T get();
    default String greet() {
        return "Hello, World ";
    }
    default String greet2() {
        return "Hello, World 2";
    }
}

因此 java 将很容易找到正确的(抽象)方法,因为它是 唯一的

        Supplier<Car> fordCarProvider = () -> new Car("Ford", 1500, 4, 43000);
        Supplier<Car> bmwCarProvider = () -> new Car("BMW", 1500, 4, 83000);

        System.out.println(fordCarProvider.get());
        System.out.println(bmwCarProvider.get());

但如果你有多个抽象方法,它就不再是一个 FunctionalInterface。因为可能会出现歧义。

// No more @FunctionalInterface
public interface Supplier<T> {
    T get();
    String greet();
    default String greet2() {
        return "Hello, World 2";
    }
}

【讨论】:

    【解决方案2】:

    Java 中的@FunctionalIntefaceinterface,只有一种方法。

    https://www.baeldung.com/java-8-functional-interfaces

    【讨论】:

    • 澄清:只有一个abstract 方法。可以有其他方法,只要是defaultstatic即可。
    • 是的。默认方法可能存在
    • @Andreas 进一步澄清,正是一个抽象方法与java.lang.Object 的公共方法的签名不匹配。但是注释本身 has a documentation 和语言规范 explains it,所以我们不需要指向 baeldung.com 的链接,该链接因草率或完全错误的文章而臭名昭著,其唯一目的似乎是向我们提出有关 Stackoverflow 的更多问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多