问题标签 [default-method]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
63 浏览

java - 接口:使用默认方法超越抽象类的优势(只是一个讨论)

随着 Java 8 的正式发布,每个开发者,尤其是 Java 极客,都对 Lambda 表达式产生了浓厚的兴趣。他们有理由兴奋,因为 scala 和 clojure 已经对 JVM 的开发产生了巨大的影响。现在为了支持 Lambda 表达式,Java 推出了另一个支持功能,称为接口的默认方法。由于我不是Java专家,因此请让我接受技术错误。AFAIK 抽象类提供了类似的功能。所以我们是否开始接受我们已经剥夺了抽象类的主要优势的事实。

期待评论,这将使我清楚抽象仍然具有优于默认方法接口的方面的优势。

pS 我知道抽象类可以保持对象的状态。它可以有构造函数和成员变量。

0 投票
5 回答
15154 浏览

java - 有没有办法将默认构造函数添加到接口

现在 Java 8 添加了默认方法,有什么方法可以创建默认构造函数吗?

我试过了:

<identifier> expected从 Netbeans获取错误

为什么需要?我正在使用 Gson 序列化对象并得到“无法调用无参数构造函数..”错误,我知道我可以使用 Gson 的InstanceCreator解决这个问题。但是有没有办法创建一个默认的构造函数?

更新

我发现我自己的代码有问题。我正在使用

代替

因此,即使子类具有默认构造函数,反序列化代码也是不正确的。但是默认构造函数的问题仍然存在。

0 投票
2 回答
1685 浏览

java - Java 8 中接口和抽象类的根本区别

考虑到接口现在可以为它提供的方法提供实现,我无法正确地合理化接口和抽象类之间的区别。有谁知道如何正确解释差异?

我还被告知,与抽象类相比,接口在性能方面更轻量级。有人可以证实这一点吗?

0 投票
1 回答
232 浏览

java - 是否可以调用超接口的默认方法?

假设我有两个课程,A并且B

实例化Bas后b,就可以调用Blike 的方法了b.method()。我也可以B用. 但是如果是一个接口呢:Asuper.method()A

有什么办法可以让B' 方法调用A' 的方法?

0 投票
1 回答
289 浏览

java - 子接口是默认方法冲突的解决方案吗?

考虑下面的代码,它是一个实际用例的提取,其中LinkedList<E>实现了List<E>Deque<E>

可以观察到两个接口都有一个size()和一个isEmpty()方法,其中isEmpty()方法可以默认为size().

所以,让我们这样做(使用虚拟接口),因为 Java 8 还没有这样做:

哎呀!我们得到一个编译时错误LinkedList,因为它不知道isEmpty()要使用哪个实现,所以我们添加这个:

现在,对于这个用例,我们几乎失去了默认方法的所有好处,因为编写该isEmpty()方法仍然需要像以前一样多的代码。

但是能解决吗?是的!

考虑以下实现:

所以问题

  • 这是我们以及 JDK 在未来实现中应该如何处理它的方式吗?
0 投票
4 回答
8431 浏览

java - 何时初始化具有默认方法的接口?

在搜索 Java 语言规范以回答这个问题时,我了解到

在一个类被初始化之前,它的直接超类必须被初始化,但该类实现的接口没有被初始化。类似地,接口的超接口在接口初始化之前不会被初始化。

出于自己的好奇,我试了一下,果然,界面InterfaceType没有初始化。

该程序打印

但是,如果接口声明了一个default方法,那么就会发生初始化。考虑InterfaceType给出的接口为

然后上面的相同程序将打印

换句话说,static接口的字段被初始化(详细初始化过程中的步骤 9),并且被static初始化的类型的初始化器被执行。这意味着接口已初始化。

我在 JLS 中找不到任何东西表明这应该发生。不要误会我的意思,我知道这应该发生在实现类不提供该方法的实现的情况下,但如果提供了怎么办?Java 语言规范中是否缺少此条件,是我遗漏了什么,还是我错误地解释了它?

0 投票
5 回答
41908 浏览

java - 为什么 Java 8 接口方法中不允许使用“final”?

Java 8 最有用的特性之一是default接口上的新方法。引入它们的原因基本上有两个(可能还有其他原因):

从 API 设计者的角度来看,我希望能够在接口方法上使用其他修饰符,例如final. 这在添加便捷方法时很有用,可以防止实现类中的“意外”覆盖:

Sender如果是一个类,以上已经是常见的做法:

现在,defaultandfinal显然是矛盾的关键字,但 default 关键字本身并不是严格要求的,所以我假设这种矛盾是故意的,以反映“带主体的类方法”(只是方法)和“接口”之间的细微差别带有主体的方法”(默认方法),即我尚未理解的差异。

在某些时候,还没有完全探索对接口方法等修饰符的支持,static引用Brian Goetz的话:final

另一部分是我们将在接口中支持类构建工具的程度,例如最终方法,私有方法,受保护方法,静态方法等。答案是:我们还不知道

自 2011 年底以来,显然static增加了对接口方法的支持。显然,这为 JDK 库本身增加了很多价值,例如Comparator.comparing().

问题:

是什么原因final(也是static final)从未进入 Java 8 接口?

0 投票
2 回答
27499 浏览

java - Java 8 接口方法中不允许“同步”的原因是什么?

在 Java 8 中,我可以轻松编写:

我将获得我也可以在类中使用的完整同步语义。但是,我不能synchronized在方法声明中使用修饰符:

现在,人们可以争辩说,这两个接口的行为方式相同,只是在 on和 on 上Interface2建立了一个合同,这比什么强一点。当然,我们也可能会争辩说,实现不应该对具体的实现状态做出任何假设,或者这样的关键字根本不会发挥作用。method1()method2()Interface1default

问题:

JSR-335 专家组决定不支持synchronized接口方法的原因是什么?

0 投票
4 回答
3960 浏览

java - java默认方法不起作用

我最近升级到 java,我正在尝试使用新的默认接口方法。但是,我不断收到令牌“默认”的语法错误,请删除此令牌。这是我预计会出现问题的构建路径: 在此处输入图像描述]![[1]

我怀疑它与我的构建路径有关,但不知道是什么。如果它与我的代码有关,这是我正在尝试的代码:

有人有什么想法吗?

0 投票
5 回答
21608 浏览

java - Java8:为什么禁止为 java.lang.Object 中的方法定义默认方法

默认方法是我们 Java 工具箱中一个不错的新工具。但是,我尝试编写一个定义default该方法版本的接口toString。Java 告诉我这是被禁止的,因为声明的方法java.lang.Object可能不会被default编辑。为什么会这样?

我知道有“基类总是获胜”的规则,所以默认情况下(双关语;),任何方法default的实现Object都会被方法覆盖ObjectObject但是,我认为规范中的方法不应该有例外。特别是对于toString拥有默认实现可能非常有用。

那么,Java 设计者决定不允许default方法覆盖来自的方法的原因是什么Object