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

java - Java 是否有计划用默认方法(java8)替代抽象类?

Java有default method替代方案 Abstract Class吗?我找不到使用默认方法而不是 Abstract 的真实案例?

0 投票
1 回答
584 浏览

java-8 - java接口中的默认方法是反模式吗?

Java 8 在接口上引入了默认方法,以便为集合接口的实现提供向后兼容性,以避免遗留库上的 MethodNotFound 错误。

即具有 List 的 java 7 实现的库将不会实现 stream() 方法。如果 java 8 代码使用此库,则默认实现提供了一个回退。

我在实践中看到的是,许多开发人员过分热衷于使用此功能来模拟混合和多重继承,其风格类似于 scala 特征。

我担心的一个问题是,这种编程风格模糊了接口(即合约)与其实现之间的界限,因此引入了隐藏的紧密耦合并违反了控制反转,迫使我使用后门通过覆盖默认实现来测试代码我的单元测试,以抑制不应出现在单元测试级别的行为。

使用默认方法是一种反模式,还是只有我一个人怀疑这一点?

0 投票
3 回答
491 浏览

java-8 - Java 8 没有提供与解决接口默认方法相同的解决方案来允许多重继承

问题:

我们知道 Java 不允许扩展多个类,因为这会导致编译器无法决定使用哪个超类方法的钻石问题。使用接口默认方法,钻石问题是在Java 8中引入的。也就是说,因为如果一个类实现了两个接口,每个接口都定义了相同的默认方法,并且实现类没有覆盖公共默认方法,编译器就无法决定选择哪个实现。

解决方案:

Java 8需要为由多个接口实现的默认方法提供实现。因此,如果一个类同时实现了上面提到的两个接口,它就必须为通用默认方法提供一个实现。否则编译器会抛出编译时错误。

问题:

为什么这个解决方案不适用于多类继承,通过覆盖子类引入的常用方法?

0 投票
3 回答
1119 浏览

java - 如何初始化类在接口默认方法?

我有一个界面:

错误消息星号线:

局部变量 s 可能尚未初始化

局部变量 t 可能尚未初始化

我想用这个方法返回一个带有[S.classname][T.classname]的字符串。请让我知道如何实现这一点,或者这在界面上是不可能做到的?

更新:1月12日

我这样做的目的是因为这个类将在框架中,我想尽可能地减少人为错误。我将代码更改如下:

0 投票
4 回答
1047 浏览

java - Java8中钻石问题解决或多重继承的规则

在 Java 中,一个类只能扩展一个父类,但可以实现多个接口。随着在 Java 8 接口中引入默认方法,一个类可能会通过实现具有相同默认方法的 2 个接口来继承多个具有相同签名的方法 这可能会像 C++ 中一样产生菱形问题

下面代码中的示例输出

这是第二个

Java用来解决钻石问题的解决规则是什么?一个简单的答案,比如谁优先,什么时候会很棒。

0 投票
3 回答
101 浏览

java - 这是对 Java 默认接口方法的可接受使用吗?

这将是界面的初始设计。像这样的东西是可以接受的默认方法的使用(基本上是默认参数),还是应该只在未来使用它们来增加功能?

0 投票
2 回答
2734 浏览

java - 在接口默认方法中抛出异常

最近我遇到了这段代码。

后来,事实证明这是这个项目的一般惯例。它被认为是一种好的做法吗?

0 投票
1 回答
378 浏览

java - Java 8:自动组合多个接口的默认方法

我有类实现了多个具有相同默认默认方法的接口。我想知道如何从所有接口组合默认方法。例如:

在实现中,该方法只是process()从所有接口合成。但是我必须明确地调用IA.super.process(), 。如果接口列表很长,把它们都写出来是很痛苦的。此外,我可能有不同的类来实现不同的接口组合。是否有其他语法糖/设计模式/库可以让我自动完成?IB.super.process()IC.super.process()

更新:与复合模式比较

复合图案也相当可观。但是我想使用默认方法作为 mixin 来为类提供不同的行为,而复合模式在这里没有给我静态类型检查。复合模式还引入了额外的内存占用。

0 投票
2 回答
360 浏览

java-8 - 开放封闭原则与默认实现

Java 8 引入了接口默认实现的概念?这不违反开放封闭原则吗,因为基于https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html上的示例,您似乎可以随时打开界面以添加新功能?

0 投票
1 回答
1305 浏览

spring-data-rest - Spring data rest - 暴露默认方法

我有一个人员存储库如下

我无法通过 rest 公开默认方法。有没有办法在不创建 repo 实现的情况下做到这一点?