问题标签 [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 投票
2 回答
1372 浏览

cdi - Java 8 默认接口方法不被识别为 EL 中的托管 bean 属性

我正在尝试设置我自己的 JSF 标签库。所以我创建了一个复合组件,它有一个支持接口作为蓝图,为这个组件构建一个支持 bean。

所以我有登录站点的密码、用户名和验证方法。此外,O 希望为 Inputtext 水印和按钮提供一些默认命名。如果执行人想改变它,他可以。

我使用自己的 JSF 标记在真实应用程序的 Backing bean 中实现了这个接口。

我坚信它可以这样工作。但我得到了错误:'引起:javax.el.PropertyNotFoundException:类'Login'没有属性'usernameWatermark'。'

似乎接口的默认实现没有在我的实现 bean 中继承。为什么以及我可以做些什么来为我的组件提供默认实现?

编辑:我尝试了以下操作来省略对接口默认方法 conecpt 的误解。我在一个普通的java项目中使用了我的接口和der实现类,试图通过Login类访问getLoginButtonValue。

效果很好。打印出正确的字符串。无需实现默认方法来访问它们。那么问题出在哪里?也许有像 cdi、bean-resolver 或其他不知道这个 java 8 概念的东西?

0 投票
1 回答
44 浏览

inheritance - 类 3 实现了 i 并扩展了 c,i 有一个默认方法,而 c 有一个相同的方法,但实现不同。哪个实现适用于 3?

如果我有一个 interfacei和一个 class ci则有一个默认方法(Java8)并且c有一个具有相同签名但具有不同实现的方法。哪个实现适用于3实现i和扩展的类c

0 投票
8 回答
5363 浏览

java - 如何从动态代理显式调用默认方法?

由于 Java 8 接口可以有默认方法。我知道如何从实现方法中显式调用该方法,即(请参阅在 Java 中显式调用默认方法

但是如何使用反射显式调用默认方法,例如在代理上?

例子:


编辑:我知道在How do I invoke Java 8 default methods reflectively中提出了一个类似的问题,但这并没有解决我的问题,原因有两个:

  • 该问题中描述的问题旨在总体上如何通过反射调用它-因此没有区分默认方法和覆盖方法-这很简单,您只需要一个实例。
  • 答案之一 - 使用方法句柄 - 只适用于讨厌的黑客(恕我直言),例如将访问修饰符更改为查找类的字段,这是同一类别的“解决方案”,如下所示:使用 Java 反射更改私有静态最终字段很高兴知道这是可能的,但我不会在生产中使用它——我正在寻找一种“官方”的方式来做到这一点。

IllegalAccessException扔进去unreflectSpecial

0 投票
1 回答
1015 浏览

java - 为什么继承的默认方法不能像继承的类方法那样实现另一个接口?

我正在研究 Java 8,并且遇到了一种default我无法完全理解的方法的行为。

首先,一个可以完美编译和运行的“老式”Java 代码片段:

C继承一个实现print()自和一个被认为正确实现A的抽象print()B

但是如果A变成了一个interfacewithdefault方法print(),如下:

即使C仍然继承print()A,编译器也会抱怨事实C并非如此abstract(如果是如前所示的类,则不会发生同样的事情A)。如果C变成abstract如下:

然后编译器抱怨C继承了 a default(from A) 和 an abstract print()(from B) 的事实。

解决方案是定义一个abstract print()in C,如:

或覆盖print(),如:

有谁知道在从 a 继承 a 和从父类继承它之间是否存在这种不对称行为的特殊default method原因interface

这里是否以某种方式涉及致命的死亡钻石(我不明白为什么)?

0 投票
2 回答
2140 浏览

java - 为什么不使用 Java 8 中的默认构造函数?

我读了这个问题。答案是即使在 Java 8 中(我们可以在接口中使用默认方法),我们也不能使用默认构造函数。它说这没有任何意义。

有人可以解释为什么它没有任何意义,或者 Java 8 中不支持默认构造函数的原因是什么?

0 投票
0 回答
64 浏览

java - 具有默认方法的接口的 Java 8 抽象类

我有一个A带有默认方法的接口printme(),与抽象类中的方法相同B。如果我B用一个TestClass和实现接口扩展抽象类Aprintme()方法在TestClass. 下面是代码:

我无法理解我如何以及为什么无法从 Abstract 类访问方法。

0 投票
1 回答
14877 浏览

maven - maven-plugin-plugin:descriptor 目标在文件和文件中失败

在开发 Maven 插件时,构建打印错误:

即使该文件Iface.java是可编译的。

Iface.java

pom.xml

是什么导致了问题?如何修复?

0 投票
1 回答
74 浏览

oop - 两个默认方法互相调用

我有一个这样的界面:

一开始我以为这样就可以了:

我的问题是我想执行foo一次或n多次。任何实现类都可以覆盖其中之一或两者。(第二种方法存在于性能关键系统中的批处理目的)

但似乎我的解决方案使用default的不是很好的风格,因为可以不覆盖它们并且调用任何一个都会导致无限循环(并最终导致 StackOverflow)。

所以,我的问题是:什么是好的 OOP 风格折衷方案?

0 投票
3 回答
376 浏览

java - Java8 对具有数千个同名默认方法的接口进行慢速编译

给定接口(它们非常大并且由语言定义生成):

现在编译 VisitorA 接口(包含大约 2000 个重载方法)大约需要 10 秒。编译VisitorB 和VisitorC 接口分别需要大约1.5 分钟。 但是当我们尝试编译VisitorD接口时,Java 8编译器大约需要7分钟!

  • 有人知道为什么编译VisitorD需要这么多时间吗?
  • 是因为默认方法的继承吗?
  • 还是因为钻石星座,VisitorB和VisitorC都扩展了VisitorA和VisitorD又扩展了VisitorB和VisitorC?

我们已经尝试过,以下解决方案有所帮助:

而现在visitorD的编译时间只需要2分钟左右。 但这仍然很多。

  • 有人知道如何将 VisitorD 的编译时间减少到几秒钟吗?
  • 如果我们去掉 VisitorD, 的两个 extends 关系extends VisitorBPlain, VisitorCPlain,那么这个接口的编译时间大约需要 15 秒——尽管它有大约 5.000 个默认方法。但是出于强制转换的原因,我们需要 VisitorD 与 VisitorB 和 VisitorC 兼容(通过直接扩展或具有中间纯接口的间接扩展)。

我还阅读了类似问题的答案: JDK8 编译速度慢 ,但问题似乎在于泛型类型推断:“在基于泛型目标类型的重载解决方面,Java 8 中存在严重的性能退化。”

所以这有点不同,如果有人有一个小费或一个很好的解释为什么会这样;我将非常感谢。

谢谢你,迈克尔

0 投票
3 回答
2485 浏览

java - 添加方法还是不向接口添加方法?

在 Java 8 中,除了需要在具体类中实现的声明外,我们还可以对接口中的方法进行默认实现。

在接口中使用默认方法是一种好的设计还是最佳实践,还是 Java 8 提出这种方法只是为了对旧 API 提供更多支持?我们应该从在新的 Java 8 项目中使用默认方法开始吗?

请帮助我详细了解什么是好的设计。