当前位置: 首页 > 面试题库 >

@FunctionalInterfaces可以有默认方法吗?

安博文
2023-03-14
问题内容

为什么我不能@FunctionalInterface使用默认方法实现创建一个?

@FunctionalInterface
public interface MyInterface {
    default boolean authorize(String value) {
        return true;
    }
}

问题答案:

您可以在功能接口中使用默认方法,但是其约定要求您提供一个单一的抽象方法(或SAM)。由于默认方法具有实现,因此它不是抽象的。

从概念上讲,功能接口仅具有一种抽象方法。由于默认方法具有实现,因此它们不是抽象的。

如果使用此注释类型对类型进行注释,则编译器需要生成错误消息,除非:

该类型是接口类型,而不是注释类型,枚举或类。

带注释的类型满足功能接口的要求。

在这里,您不满足功能接口的要求,因此需要提供一种抽象方法。例如:

@FunctionalInterface
interface MyInterface {

    boolean authorize(int val);

    default boolean authorize(String value) {
        return true;
    }
}

请注意,如果您声明一个抽象方法来覆盖Object类中的一个公共方法,则该方法将不计算在内,因为此接口的任何实现都将至少通过Object的类实现这些方法的实现。例如:

@FunctionalInterface
interface MyInterface {

    default boolean authorize(String value) {
        return true;
    }

    boolean equals(Object o);
}

不编译。



 类似资料:
  • 为什么我不能用默认的方法实现创建一个?

  • 所以,我一直在读C++标准,找到了[defns.Undefined](3.27,在我正在读的C++17草案中,请注意,当我在这里引用C++17时,我在其他标准中发现了类似的措辞)--这是未定义行为的定义。我注意到这样的措辞(强调我的): 注意:当本国际标准省略任何行为的明确定义时,或者当程序使用错误的构造或错误的数据时,可能会出现未定义的行为 现在,想想看,这有点道理。这有点像是说,如果标准没有给

  • 主要内容:1 Java8 默认方法的介绍,2 Java8 默认方法的案例1 Java8 默认方法的介绍 Java提供了一种在接口内部创建默认方法的功能。在接口内部定义并带有默认标记的方法称为默认方法。这些方法是非抽象方法。 2 Java8 默认方法的案例 在下面的示例中,Sayable是一个功能接口,其中包含默认值和抽象方法。默认方法的概念用于定义具有默认实现的方法。您还可以覆盖默认方法,以为该方法提供更具体的实现。 输出结果为:  

  • 问题内容: 我们正在使用 PropertyPlaceholderConfigurer 在我们的Spring配置中使用java属性(此处有详细信息) 例如: 我们想添加一个附加属性,但是要有一个分布式系统,现有实例都可以使用默认值。通过在Spring config中为未定义覆盖属性值的默认值指示默认值,是否有办法避免更新所有属性文件? 问题答案: 您是否正在寻找此处记录的PropertyOverri

  • 问题内容: 我可以在AngularJS中设置路由参数的默认值吗?有没有有办法,并通过相同的途径来处理? 我希望重构现有的代码,如下所示: 它可以工作,但不是很优雅。有没有更好的办法 ? 问题答案: 不允许使用路由参数的默认值。 但是(中的)路由 不应具有默认参数。 资源可以具有默认参数。 在如果你想使用一个可选的参数的路线,这实际上是两个不同的路线。 为什么? 路线应该很简单 路由不允许参数的正则

  • Java 8在接口中引入了默认方法实现的新概念。 添加此功能是为了向后兼容,以便可以使用旧接口来利用Java 8的lambda表达式功能。 例如,“List”或“Collection”接口没有“forEach”方法声明。 因此,添加此类方法将简单地破坏集合框架实现。 Java 8引入了默认方法,因此List/Collection接口可以具有forEach方法的默认实现,而实现这些接口的类不需要实现