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

java - Java 8默认接口方法上的Spring集成@ServiceActivator

我想@ServiceActivator在 Java 8 默认接口方法上使用注释。此默认方法将根据业务规则委托给此接口的另一个方法。

然后这个接口由一个 Spring@Service类实现:

执行代码时,这不起作用!

我只能让它@ServiceActivator从默认方法中删除注释,并在我的类中覆盖该默认方法@Service并委托给超级方法:

覆盖默认方法会忽略默认方法的用途。

是否有另一种方法可以以干净的方式实现此场景?

0 投票
2 回答
332 浏览

java - 接口中的静态公共方法和非静态默认方法

在浏览 java 1.8 的 java.util.Collections 接口的源代码时,我注意到了这一点,

所以从 1.8 开始,java 允许接口中的方法定义主体。但是有一些语义上的特殊性;如果该方法是公开的,我也需要将其明确提及为静态,这是可以理解的,但为什么默认情况下不强制执行?事实上,用默认值指定静态会产生错误。这是为了什么目的?

编辑:看到反对票的数量,我鼓励你先尝试一下,然后再难以置信地得出结论

0 投票
2 回答
417 浏览

java - 不允许使用站点向 Java 8 注入扩展方法的设计考虑是什么?

我们有默认方法,也称为防御方法和“虚拟扩展方法”。

虽然我很欣赏默认方法的巨大价值(在某些方面甚至比它们的 C# 对应物更强大),但我想知道在不访问其源代码的情况下允许扩展现有接口的决定是什么。

在 SO Brian Goetz 的一个答案中,他提到默认方法的设计非常方便以及接口演变。因此,如果我们编写一个接口,我们可以在其中填充通常必须放在单独的类中的各种实用方法。那么为什么不加倍努力并允许它用于不受我们控制的接口呢?

0 投票
1 回答
2213 浏览

java - 扩展其他接口的默认方法和接口

假设有两个接口Interface1Interface2where Interface2extends Interface1

假设我想创建一个实现的类,Interface2但我想method()成为Interface1. 如果我写

我得到编译错误:

默认超级调用中的错误类型限定符:冗余接口 Interface1 由 Interface2 扩展

可以通过创建第三个接口来解决这个问题:

然后:

这编译得很好,如果我实例化一个 newMyClass并调用method(),输出是1预期的。

所以我的问题是,鉴于很容易绕过只能InterfaceName.super.method()为链中最具体的接口编写的限制,限制的原因是什么?一开始就禁止你写作可以防止哪些问题Interface1.super.method()

0 投票
1 回答
1471 浏览

debugging - Java调试器不能调用一些默认方法实现

我在 IntelliJ IDEA 中编码。在调试我的应用程序时,我不能在Watches中使用一些默认方法实现。

这是一个精简的例子:

main()方法中,我设置了一个断点并设置了三个手表:

第一个手表抛出NoSuchMethodException抱怨该方法Friendship$BasicFriend.sayHiTo()不存在。

第二个手表成功运行,但奇怪的是它报告了一个装箱的对象 {java.lang.Integer@537} "2",而不仅仅是一个原始的2

正如预期的那样,第三个手表报告了一个原始 1。

为什么第一只手表不工作?这是一个错误吗?这实际上与IDE有关吗?是因为默认方法的一些概念缺陷吗?它应该首先按照我的意愿工作吗?第二只手表的奇怪结果与第一只手表的问题有某种关系吗?

0 投票
1 回答
77 浏览

java - 在断点上放置监视时,Java 调试器显示一个装箱的 Integer 而不是原始 int

这个简单的例子演示了这个问题:

我在 IntelliJ IDEA 中以调试模式运行此代码,并将两个手表放在 main 方法中:

这两种方法都应该返回一个原始 int,但是只有第二个 watch(类方法)显示一个原始 int,而第一个(默认接口方法)显示一个装箱的 Integer 对象。

手表

这是为什么?那是一个错误吗?

0 投票
1 回答
5788 浏览

java - 函数式接口继承怪癖

我有一个使用了一段时间的自定义界面,看起来像这样:

我想用 JavaFunction和 Guava来改造这个接口Function,同时保持它的FunctionalInterface. 我以为我有完美的安排:

两个超接口都声明了相同的apply()方法,这个方法已经在我的接口中实现了,只留下抽象call()方法。奇怪的是,它不会编译,告诉我

'@FunctionalInterface' 注释无效;Function<T,R> 不是函数式接口

更奇怪的是,以下变体编译得很好:

第一个版本无法编译是否有原因?

0 投票
1 回答
667 浏览

java - Gephi 的 java 默认方法未在 C# 中使用 ikvm-from dll 库实现

我对java的了解很少,所以我可能误解了我的问题:

我正在研究 Java 中的 Gephi API,我使用 IKVMC 来处理 dll。

我尝试按照 Gephi 文档https://github.com/gephi/gephi/wiki/How-to-manipulate-Graph中的说明创建一个空图

在 C# 中我试过这个:

在第二行,我收到以下错误:

异常非 gérée : System.TypeLoadException: La 方法 'thenComparing' du ty pe 'org.openide.util.lookup.ALPairComparator' de l'assembly 'gephi-toolkit, Vers ion=0.0.0.0, Culture=neutral, PublicKeyToken=null 'n'a pas d'implémentation。à org.openide.util.lookup.AbstractLookup.getPairsAsLHS() à org.openide.util.lookup.MetaInfServicesLookup.beforeLookup(模板)à org.openide.util.lookup.AbstractLookup.lookupItem(模板模板)à org.openide。 util.lookup.AbstractLookup.lookup(Class clazz) à org.openide.util.Lookup.getDefault() à myproject ....

用英语它很快就说 thenComparing() 方法没有实现 org.openide.util.lookup.ALPairComparator 类型。

我做了一些研究,在反编译的 dll 中,错误似乎在这里

我发现 thenComparing 是一个“默认”方法,在 java 8 中,如果我没有说错,默认方法已经实现。

我的项目参考了 IKVM 的 java.util 库。

所以也许这是一个问题,在 C# 中使用 ikvm 严重支持默认方法的实现,或者 thenComparing 严重支持内部 ALPairComparator 类型。

真诚地,我不太清楚它可能来自哪里,所以任何线索都会受到欢迎。如果您有任何问题或需要更精确的信息,请问我。

谢谢您的帮助。

编辑:我注意到 Gephi 与 java 1.8 不兼容,但与 java 1.7 不兼容

EDIT2:我正在尝试将我的 dll 中的 org.openide.util 包替换为带有 IlSpy 的 java 1.7 上的旧版本

0 投票
1 回答
262 浏览

java - 使用 ECJ 的 Lambda/默认方法/类型擦除怪癖/错误?

今天遇到了这个问题,花了很长时间试图重现/弄清楚发生了什么。有人可以解释为什么会发生这种情况,或者这是类型擦除/默认方法/lambda/多态性的错误吗?取消注释默认方法使其运行良好,但我希望它可以按原样工作

输出:

代码

0 投票
5 回答
7396 浏览

java - 使用 Java 8 的模板方法设计模式

我想使用 java 8 新的默认方法重构模板方法。假设我在抽象类中有一个流程定义:

而且我几乎没有扩展上述流程管理器的子类,并且每个子类都实现了自己的phase1方法phase2。我想知道将代码重构为这样的接口是否有意义:

你怎么看?