问题标签 [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.
java - 像可序列化这样的标记接口可以包含默认方法吗?
我认为不能,因为标记接口原则是没有任何方法,但由于默认方法不是抽象的,我不确定。
java - 为什么 Java 8 不允许非公共默认方法?
举个例子:
简单地说,这将打印Hello world!
. 但是假设我正在使用 的返回值做其他事情Testerface#example
,例如初始化数据文件并返回不应离开实现类的敏感内部值。为什么 Java 不允许在默认接口方法上使用访问修饰符?为什么它们不能被子类保护/私有并可能被提升(类似于扩展父类的类如何为被覆盖的方法使用更可见的修饰符)?
一个常见的解决方案是转移到一个抽象类,但是在我的具体情况下,我有一个枚举接口,所以这里不适用。我想它要么被忽略了,要么是因为接口背后的原始想法是它们是可用方法的“合同”,但我想我想输入关于这件事的看法。
我读过“为什么 Java 8 接口方法中不允许使用“final”? ”,其中指出:
默认方法的基本思想是:它是具有默认实现的接口方法,派生类可以提供更具体的实现
在我看来,能见度根本不会破坏这方面。
与链接的问题一样,因为它似乎无法关闭,因此在此问题上将不胜感激权威答案,而不是基于意见的答案。
java - 如果两个接口包含相同的默认方法会发生什么?
如果我有两个具有相同默认方法的接口,并且都使用一个类实现/请参阅此程序。
那么会发生什么?而且我在这个程序中遇到了不相关的错误。
java - 你能让 mockito (1.10.17) 在接口中使用默认方法吗?
我是 mockito 的忠实粉丝,不幸的是,对于我使用 Java 8 的一个项目,它对我来说失败了......
设想:
不幸的是,测试失败并foo.bar()
返回 0。
当我取消注释该when()
行时,我得到一个堆栈跟踪......
这是 maven 上可用的最新稳定版本;关于 Java 8 中的这个新功能,谷歌搜索并没有告诉我太多关于 mockito 的状态......
spy()
除了实现接口和在接口上(这行得通)之外,你能不能让它以其他方式工作?
java - Java 8 默认方法接口覆盖对象等于方法
为什么上面的代码会出现“java: default method equals in interface Table overrides a member of java.lang.Object”的编译错误?难道我们不能使用接口默认方法覆盖hashCode和equals方法,大概我在同一个接口中有方法来确定实现这个接口的对象的相等性?
java - Java 8 默认方法可读性
Java 8 引入了默认方法的概念。考虑以下带有默认方法的接口:
还有一个实现这个接口的类:
我对以下调用的可读性有疑问mayOrMayNotImplementThisMethod
:
我了解在上述调用中显式指定接口名称的原因是为了避免在类实现的多个接口具有相同方法的情况下产生混淆。我不明白的是super
关键字在这种情况下的含义。当我们说 时IDefaultMethod.super
,我们到底指的是什么?IDefaultMethod.mayOrMayNotImplementThisMethod() 不是比 IDefaultMethod.super.mayOrMayNotImplementThisMethod() 更具可读性吗?删除 super 关键字使其更具可读性,但代价是区分静态或非静态方法调用。
java - Java 8 默认方法作为特征:安全吗?
在 Java 8中使用默认方法作为特性的穷人版本是一种安全的做法吗?
有人声称如果你只是为了它而使用它们可能会让熊猫感到难过,因为它很酷,但这不是我的意图。人们还经常提醒,引入默认方法是为了支持 API 演化和向后兼容性,这是真的,但这并不会导致将它们用作特征本身是错误的或扭曲的。
我想到了以下实际用例:
或者,也许,定义一个PeriodTrait
:
诚然,可以使用组合(甚至是辅助类),但它看起来更加冗长和混乱,并且不允许从多态中受益。
那么,使用默认方法作为基本特征是否可以/安全,还是我应该担心不可预见的副作用?
关于 SO 的几个问题与 Java 与 Scala 特征有关;这不是重点。我也不仅仅是征求意见。相反,我正在寻找一个权威的答案,或者至少是现场洞察力:如果你在你的公司项目中使用默认方法作为特征,那它是不是一个定时炸弹?
java - 如何在 Java 接口默认方法中模拟静态变量?
为了轻松地为我的多个项目类启用日志记录,我决定滥用 newdefault
关键字为我的类创建一个简单的方法特征:
我真正不喜欢的是log
每次都需要得到。如果我使用 C++,我会声明:
每隔一次调用该函数,记录器就已经在变量中初始化。在普通类中,我使用这种模式来模拟静态变量:
但这对于接口是不可能的。接口不能有任何属性。
那么是否有其他解决方法,还是 Java 会再次阻碍我的表现?
interface - Java8覆盖(扩展)默认方法
假设我们在接口中有一个默认方法,在实现类时,如果我们需要在默认方法之外添加一些额外的逻辑,我们是否必须复制整个方法?有没有可能重用默认方法......就像我们对抽象类所做的那样
java - JDiagram 旧版本在 ExtendedArrayList.sort 中使用 JRE 8 抛出 StackOverflowError
我正在使用 JDiagram JAR,如下所示
此代码在使用 JRE 7 运行时运行良好,但是在使用 JRE 8 运行时,会引发以下错误:
我按照堆栈跟踪到 JDiagram 反编译代码。观察到 routeAllLinks() 在另一个对象(例如路由器)上调用 RouteLinks() ,并且在更深一层上调用了出现在错误堆栈跟踪中的 ExtendedArrayList.sort()。JDiagram 中的“ExtendedArrayList”扩展了 ArrayList 并包含一个名为“sort()”的方法,该方法具有以下定义。
在 Google 上,我发现 JRE 8 引入了 List.sort() 并将 Collections.sort() 调用委托给集合的(在我的情况下为 ExtendedArrayList)排序方法。所以库 ExtendedArrayList.sort() 变成了一个覆盖。它创建了一个无限递归,导致stackoverflow。我现在也可以用一小段代码重现这个问题。
还
- 我们创建 JDiagram 对象的原始类在运行时由我们产品中的其他一些组件加载。我们对程序的加载几乎没有控制权。
- 我们发现最新版本的 JDiagram 已通过将 sort() 替换为 sortJ7() 方法来解决此问题。但是,我们目前无法升级库。JDiagram 是一个许可的 API。
- ExtendedArrayList 在内部由 JDiagram 实例化,因此我们无法从代码中更改它。
我们尝试了以下迄今为止不起作用的解决方案
- Java 代理:因为我们的代码没有直接调用 ExtendedArrayList,而且 'Diagram' 也没有任何接口。
- Spring AOP:我们没有使用 spring,而且我们的程序是由其他组件在运行时加载的。
- AspectJ:到目前为止,这显然是一个解决方案。但是,它也不起作用,因为我们无法在运行时编织我们的程序。不确定是否有人可以使它工作。
请让我知道是否需要详细说明。欢迎任何帮助。谢谢。
更新 到目前为止,javassist 是最好的方法,但是 JDiagram 混淆会阻止解决方案正常工作。考虑到我们的发布日期,我们有点假设不可能(不得不说)修复。我们已经开始升级库的过程。同时从我们的应用程序中删除了一个由 routeAllLinks() 方法提供的小功能.. :-( 感谢大家的帮助。我将继续研究这个问题,因为我发现它非常有趣和具有挑战性.. 我'如果我能解决它,我会更新这篇文章。我会为@gontard 的 javassist 方法提供赏金,因为我正在继续我的研究。谢谢。