0

正如关于虚拟扩展方法(默认方法)的官方声明所述:

虚拟扩展方法(默认方法)的目的是使接口在初始发布后能够以兼容的方式演进。”</p>

我可以在 JDK 中看到一些很好的例子吗?到目前为止,我已经在java.util.Collection界面和其他几个中找到了,但如果有一个更完整的列表会很好。

编辑:我不是在寻找使用默认方法是否安全(因为我已经阅读了链接的问题)。我一直在寻找 JDK 中的实际示例。

4

1 回答 1

3

除了集合之外,我还知道标准类中有几个地方:

  • Java SQL API 具有接口增强功能。ResultSet.updateObject添加了, PreparedStatement.setObject, PreparedStatement.executeLargeUpdate(不同于executeUpdate返回long而不是int)等等。默认情况下,它们抛出UnsupportedOperationException或其他一些异常。这就是“界面演变”:一种用新功能增强旧界面的方法。

  • 中的函数java.util.function具有允许组合它们的默认方法。这些方法预计不会被重新定义,因为函数式接口主要用于 lambdas。这些方法只是为了方便。这不是“接口演变”,因为这些接口首先出现在 Java 8 中。但是,如果这些方法不是默认的,您将无法使用 lambdas 表达这些接口,因为会违反单一抽象方法规则。

  • java.util.Comparator添加到:的几个默认方法reversed()thenComparing()等等。默认实现也很好,通常不打算被替换。这和函数类似,但Comparator接口是以前存在的,所以也是一种接口进化。

  • java.util.Spliterator接口具有默认方法。这实际上是一个很好的例子,因为这里显示了不同目的的默认方法。默认情况下会抛出该方法,但如果拆分器使用特性getComparator(),则必须覆盖该方法。SORTEDhasCharacteristic()方法只是使用非默认characteristics()方法的一种方便方式,可能永远不应该重新定义。默认实现将forEachRemaining()始终正常工作,但覆盖它可能会为某些拆分器产生更有效的结果。默认实现也总是正确的getExactSizeIfKnown(),通常不需要重新定义它。但是,如果您的拆分器从未调整大小,您可以对其进行一些优化,只需返回-1.

于 2015-08-03T12:28:12.073 回答