在java 8中,只有一个抽象方法的抽象类不是函数接口(JSR 335)。
这个接口
是一个功能接口:
public interface MyFunctionalInterface {
public abstract void myAbstractMethod();
public default void method() {
myAbstractMethod();
}
}
但这个抽象类不是:
public abstract class MyFunctionalAbstractClass {
public abstract void myAbstractMethod();
public void method() {
myAbstractMethod();
}
}
因此,我不能将抽象类用作lambda表达式和方法引用的目标。
public class Lambdas {
public static void main(String[] args) {
MyFunctionalAbstractClass functionalAbstractClass = () -> {};
}
}
编译错误为:此表达式的目标类型必须是函数式接口
。
为什么语言设计者会施加这种限制?
自从Lambda项目开始以来,这一直是一个重要的话题,并得到了很多思考。首席Java语言架构师Brian Goetz强烈支持lambda作为函数而不是对象的观点。引用:
我相信,发展Java的最佳方向是鼓励更具功能性的编程风格。Lambda的作用主要是支持功能更强大的类库的开发和使用
我对Java的未来持乐观态度,但为了向前发展,我们有时不得不放弃一些舒适的想法。lambda是打开门的功能。lambda是对象关闭它们。我们宁愿看到那些门开着。
这是引用来源的链接,这是布赖恩最近的帖子,重申了同样的哲学观点,并用额外的、更实际的论点重申了这些观点:
使模型更简单为各种虚拟机优化打开了大门。(这里抛弃身份是关键。)函数是值。将它们建模为对象会使它们比需要的更重、更复杂。
在将这个用例放到总线下之前,我们做了一些语料库分析,以发现与接口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。接口的所有方法均为抽象。在这种情况下,两者之间的主要区别是什么? 纯抽象类和接口之间是否有区别?接口有什么用?在使用接口的地方,我们可以使用纯抽象类吗? 问题答案: 要完成以前的答案: 接口是一个“合同”。如果一个类实现一个接口,则它必须提议该接口中列出的所有服务。 抽象类是骨