Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何避免接口中的静态和默认方法_Java_Interface_Java 8 - Fatal编程技术网

Java-如何避免接口中的静态和默认方法

Java-如何避免接口中的静态和默认方法,java,interface,java-8,Java,Interface,Java 8,我的问题相当理论化: 假设我有一个Java8项目,在接口中使用静态和默认方法。我需要摆脱它们,因为我正在将代码移植到Java7(假设它是安卓N之前的安卓应用程序) 怎么做?我知道有Retrolambda插件,我成功地使用了它。但我正在考虑通过修改代码来实现“纯”解决方案。有哪些选择 我知道我可以从接口中删除静态和默认方法,并将它们放入实现该接口的抽象类中,然后在引用该接口的任何地方修改代码(如果我正确理解了该过程,这就是Retrolambda所做的) 我的老师曾表示,只要“适当地修改接口定义”就

我的问题相当理论化:

假设我有一个Java8项目,在接口中使用
静态
默认
方法。我需要摆脱它们,因为我正在将代码移植到Java7(假设它是安卓N之前的安卓应用程序)

怎么做?我知道有Retrolambda插件,我成功地使用了它。但我正在考虑通过修改代码来实现“纯”解决方案。有哪些选择

我知道我可以从接口中删除静态和默认方法,并将它们放入实现该接口的抽象类中,然后在引用该接口的任何地方修改代码(如果我正确理解了该过程,这就是Retrolambda所做的)

我的老师曾表示,只要“适当地修改接口定义”就可以做到这一点,而无需使用额外的课程。但到目前为止,我没有找到解决办法。我尝试将实现直接放入目标类,但这在我的特定项目中造成了一系列问题


有人知道我遗漏了什么想法或线索吗?

我认为,您在Java8项目中实际使用了这样的东西,一开始是值得怀疑的。接口应该保留在没有实现的情况下。默认方法的引入主要是为了实现API的向后兼容性(如果必须将方法从以前的版本添加到接口中,并且您负担不起强制API用户更改其代码,并且您不喜欢创建InterfaceV2)。不适用于“日常使用”


我认为在移植时,应该将方法导出到static*Util类。通过这种方式,您可以重用它,并且不会破坏接口的主要原则。

静态方法您可以移动到任何地方,例如,您可以为它们创建一个实用程序类。默认方法通常是接口演化的工具,因此您并不真正需要它们,只需将方法体向下推到实现接口的实际类即可。这可能会给lambdas带来一些问题,但既然你不能拥有lambdas,那么祝你快乐。:)如果任何类实现了其中一个以上的接口,则用抽象类替换接口将不起作用。只需重新询问您的老师“接口定义中的适当更改”:)好的,通过删除
default
关键字,您将强制实现者实际提供一个实现,我不会说
default
方法“主要用于API向后兼容”。看看,在新引入的Java8接口中有多少
default
方法。考虑一下,这就解释了为什么像<代码>谓词>否定> <代码>有一个<代码>默认实现,但也有一些方法,比如“代码>迭代器.ReleVE()/<代码>,现在已经有了一个<代码>默认实现,尽管根本不是新的。