正如关于虚拟扩展方法(默认方法)的官方声明所述:
The purpose of virtual extension methods (default methods) is to enable interfaces to be evolved in a compatible manner after their initial publication.”
我可以在 JDK 中看到一些关于此操作的好示例吗?
到目前为止,我已经在 java.util.Collection
接口(interface)和其他几个接口(interface)中找到了,但最好有一个更全面的列表。
编辑:我并不是在寻找使用默认方法是否安全(因为我已经阅读了链接的问题)。我一直在寻找 JDK 中的实际示例。
最佳答案
除了集合之外,我还知道标准类中有几个地方:
Java SQL API 具有界面增强功能。
ResultSet.updateObject
,PreparedStatement.setObject
,PreparedStatement.executeLargeUpdate
(不同于executeUpdate
返回long
而不是int
)等等。默认情况下,他们抛出UnsupportedOperationException
或其他一些异常。这就是“界面进化”:一种用新功能增强旧界面的方法。java.util.function
中的函数有允许组合它们的默认方法。这些方法预计不会被重新定义,因为函数式接口(interface)主要用于与 lambda 一起使用。这些方法只是为了方便。这不是“接口(interface)演变”,因为这些接口(interface)首先出现在 Java 8 中。但是,如果这些方法不是默认的,您将无法使用 lambda 来表达这些接口(interface),因为会违反单一抽象方法规则。java.util.Comparator
中添加了几个默认方法:reversed()
,thenComparing()
等等。默认实现也很好,通常不打算被替换。这与函数类似,但是Comparator
界面以前就存在,所以这也是界面的一种演变。java.util.Spliterator
接口(interface)有默认方法。这实际上是一个很好的例子,因为这里显示了不同目的的默认方法。getComparator()
方法默认会抛出异常,但如果 spliterator 使用SORTED
则必须覆盖它特征。hasCharacteristic()
方法只是使用非默认characteristics()
的便捷方法方法,并且可能永远不应该重新定义。forEachRemaining()
默认实现将始终正常工作,但覆盖它可能会对某些 spliterator 产生更有效的结果。getExactSizeIfKnown()
默认实现也始终是正确的,通常不需要重新定义它。但是,如果您的 spliterator 从未调整过大小,您可以对其进行一些优化,只需返回-1
.
关于java - Java 8 JDK 中是否有默认方法及其用法的好示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31786666/