Java-如何避免接口中的静态和默认方法
我的问题相当理论化: 假设我有一个Java8项目,在接口中使用Java-如何避免接口中的静态和默认方法,java,interface,java-8,Java,Interface,Java 8,我的问题相当理论化: 假设我有一个Java8项目,在接口中使用静态和默认方法。我需要摆脱它们,因为我正在将代码移植到Java7(假设它是安卓N之前的安卓应用程序) 怎么做?我知道有Retrolambda插件,我成功地使用了它。但我正在考虑通过修改代码来实现“纯”解决方案。有哪些选择 我知道我可以从接口中删除静态和默认方法,并将它们放入实现该接口的抽象类中,然后在引用该接口的任何地方修改代码(如果我正确理解了该过程,这就是Retrolambda所做的) 我的老师曾表示,只要“适当地修改接口定义”就
静态
和默认
方法。我需要摆脱它们,因为我正在将代码移植到Java7(假设它是安卓N之前的安卓应用程序)
怎么做?我知道有Retrolambda插件,我成功地使用了它。但我正在考虑通过修改代码来实现“纯”解决方案。有哪些选择
我知道我可以从接口中删除静态和默认方法,并将它们放入实现该接口的抽象类中,然后在引用该接口的任何地方修改代码(如果我正确理解了该过程,这就是Retrolambda所做的)
我的老师曾表示,只要“适当地修改接口定义”就可以做到这一点,而无需使用额外的课程。但到目前为止,我没有找到解决办法。我尝试将实现直接放入目标类,但这在我的特定项目中造成了一系列问题
有人知道我遗漏了什么想法或线索吗?我认为,您在Java8项目中实际使用了这样的东西,一开始是值得怀疑的。接口应该保留在没有实现的情况下。默认方法的引入主要是为了实现API的向后兼容性(如果必须将方法从以前的版本添加到接口中,并且您负担不起强制API用户更改其代码,并且您不喜欢创建InterfaceV2)。不适用于“日常使用”
我认为在移植时,应该将方法导出到static*Util类。通过这种方式,您可以重用它,并且不会破坏接口的主要原则。静态方法您可以移动到任何地方,例如,您可以为它们创建一个实用程序类。默认方法通常是接口演化的工具,因此您并不真正需要它们,只需将方法体向下推到实现接口的实际类即可。这可能会给lambdas带来一些问题,但既然你不能拥有lambdas,那么祝你快乐。:)如果任何类实现了其中一个以上的接口,则用抽象类替换接口将不起作用。只需重新询问您的老师“接口定义中的适当更改”:)好的,通过删除
default
关键字,您将强制实现者实际提供一个实现,我不会说default
方法“主要用于API向后兼容”。看看,在新引入的Java8接口中有多少default
方法。考虑一下,这就解释了为什么像<代码>谓词>否定> <代码>有一个<代码>默认实现,但也有一些方法,比如“代码>迭代器.ReleVE()/<代码>,现在已经有了一个<代码>默认实现,尽管根本不是新的。