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

抽象类作为功能接口

寇涵容
2023-03-14
问题内容

在Java 8中,只有一个抽象方法的抽象类不是功能接口(JSR
335
)。

interface是一个功能接口:

public interface MyFunctionalInterface {
    public abstract void myAbstractMethod();
    public default void method() {
        myAbstractMethod();
    }
}

但这abstract class不是:

public abstract class MyFunctionalAbstractClass {
    public abstract void myAbstractMethod();
    public void method() {
        myAbstractMethod();
    }
}

因此,我不能将抽象类用作lambda表达式和方法引用的目标。

public class Lambdas {
    public static void main(String[] args) {
        MyFunctionalAbstractClass functionalAbstractClass = () -> {};
    }
}

编译错误为:The target type of this expression must be a functional interface

语言设计者为什么要施加此限制?


问题答案:

自Lambda项目成立以来,这一直是一个重要的话题,并且引起了很多思考。Java语言首席架构师Brian Goetz强烈支持将lambda视为 功能
而非 对象 的观点。引用:

我相信,Java演进的最佳方向是鼓励一种更具功能性的编程风格。Lambda的作用主要是支持开发和使用更具功能性的库

我对Java的未来感到乐观,但是要前进,我们有时不得不放弃一些舒适的想法。Lambdas-are函数打开了大门。Lambdas-are-
objects将它们关闭。我们更愿意看到那些门保持打开状态。

这是引述来源的链接,这是布莱恩(Brian)的最新文章,重申了相同的哲学观点,并通过其他更实际的论点予以重申:

使模型更简单为各种VM优化打开了大门。(在这里,简捷身份是关键。)功能是价值。将它们建模为对象会使它们变得比所需的更重,更复杂。

在将此用例投入总线之前,我们进行了一些语料库分析,以发现与接口SAM相比,抽象类SAM的使用频率。我们发现在该语料库中,只有3%的lambda候选内部类实例将抽象类作为目标。其中大多数都适合于简单的重构,在该重构中,您添加了一个接受以接口为目标的lambda的构造函数/工厂。



 类似资料:
  • 在java 8中,只有一个抽象方法的抽象类不是函数接口(JSR 335)。 这个是一个功能接口: 但这个抽象类不是: 因此,我不能将抽象类用作lambda表达式和方法引用的目标。 编译错误为:。 为什么语言设计者会施加这种限制?

  • 我想读关于抽象的文章,但读到不同的文章,我感到很困惑。 下面是我无法理解的问题: 1)“抽象是通过使用抽象类和接口实现的吗?”我对此进行了搜索,得到了三种类型的答案: 与此处解释的不同。 它们是相同的,只是不同的观点,就像这里解释的。 最后一个是抽象类用来实现抽象。 哪一个是真的?请举一个简单的例子。 2)“抽象意味着隐藏不必要的细节。比如专注于一个对象做什么而不是它是如何完成的。” 这是正确的吗

  • 接口描述了类的行为和功能,而不需要完成类的特定实现。 C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。 如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的,如下所示:class Box { public: // 纯虚函数 virtual double getVolume() =

  • 我有一个子类,它声明了我的抽象超类中的所有方法,但它仍然给我一个错误,说明我的类不是抽象的。我不知道为什么会抛出这个错误。 我得到的具体错误是 PhoneBookEntry.java: 1:错误:PhoneBookEntry不是抽象的,并且不会覆盖可比中的抽象方法compareTo(Object) 我的问题代码: 还有我的子类:

  • 问题内容: 在面试中,有人问我以下问题。我试图回答这个问题,但是我想确切回答这个问题。 如果我可以将Abstract类模拟为Interface,为什么Java提供了Interface? 这意味着如果在Abstract类中我可以将所有方法标记为abstract,然后abstract类将用作接口,那么为什么我需要接口。 谁能简单地解释一下我。 问题答案: 这是一个非常标准的面试问题。答案是:因为您可以

  • 问题内容: 谁能告诉我完全抽象的类和接口之间到底有什么区别? Abstract类也可以将其所有方法都作为abstract。接口的所有方法均为抽象。在这种情况下,两者之间的主要区别是什么? 纯抽象类和接口之间是否有区别?接口有什么用?在使用接口的地方,我们可以使用纯抽象类吗? 问题答案: 要完成以前的答案: 接口是一个“合同”。如果一个类实现一个接口,则它必须提议该接口中列出的所有服务。 抽象类是骨