Java 8:Spliterator,Iterator,Collection和Interfaces中的"默认"实现(名为spliterator的重复方法)

Gum*_*ron 13 interface backwards-compatibility java-8 spliterator

在Java 1.8.0_25发布之后,有一个有趣的情况...我认为我的问题的根源主要与Interfaces中"默认"实现的新(到1.8)功能有关.

我正在开发的应用程序目前的目标是1.7,到目前为止一直运行良好.直到用户开始更新到1.8.现在我们的用户已经开始更新到1.8,我们的手被迫转向1.8支持.

我们已经修复了大部分问题(主要与1.7和1.8之间的JavaFX包的更改有关),但还有一个棘手的问题.

在我的智慧或缺乏中,我不久前决定创建一个从AbstractList <T>扩展的SortedList <T>.到目前为止,这个类运行良好,但是当在1.8运行时运行时,我得到:

Duplicate methods named spliterator with the parameters () and () are inherited 
from the types Collection<T> and Iterable<T>
Run Code Online (Sandbox Code Playgroud)

对我来说,这似乎是由AbstractList <T>实现的一些接口中的"默认"实现引起的(我的SortedList <T>类没有实现除Serializable之外的任何其他接口).实现Serializable是我们的另一个问题,因为我们需要支持SortedList <T>对象的反序列化,没有办法解决这个问题!).

我可以通过在SortedList <T>类中提供spliterator()的覆盖实现来消除错误.但是,如果构建它,它将不再在Java 1.7环境中运行.如果我尝试使用1.7运行时的SortedList <T>,我得到:

Problem:
Error: Unresolved compilation problems:
The import java.util.Spliterator cannot be resolved
Spliterator cannot be resolved to a type

com.xxxx.xxxx.util.SortedList.<init>(SortedList.java:13) 
Run Code Online (Sandbox Code Playgroud)

这个错误非常明显,因为我们现在已经覆盖了SortedList <T>中的spliterator()方法,它需要包含java.util.Spliterator,但1.7中不存在.

理想情况下,如果他们不愿意,我们不希望我们的客户更新到Java 1.8.

我们的手被逼到了吗?我们是否需要强制用户更新到1.8,并为自己更新为1.8的用户推出新版本?

有没有人知道解决这个问题的方法?

在一个更哲学的说明中,为什么接口已被实现损坏:-(.可能是一个漂亮的新功能,但它们确实应该避免做任何会导致对现有代码进行重大更改的事情,特别是在列表如此基本的事情上/收藏等

任何有关这种困境的帮助或建议将不胜感激.

干杯,

标记

Gum*_*ron 2

好吧,所以你们俩(@Holger 和 @assylias)都是正确的......但是,我们的情况有点复杂。

我们工作的环境是 Eclipse 3.8.1,它不支持 Java 8(据我所知,将来也不会支持)。因此,我们不能仅仅更改为 Java 8 编译器来解决问题。

我们的产品是一个相当大的 Eclipse RCP 应用程序。目前无法升级 IDE,因为这会涉及重大返工。因此我们需要在Java 1.7环境下继续开发。

如果有人感兴趣,我们已通过以下方式解决了该问题:

  • 为我们的主插件创建片段(每个导致问题的 Java 版本一个,所以在我们的例子中是三个)。这些片段被配置为补丁片段。
  • 将 Java FX JAR 添加到片段中(这样做是为了解决早期版本中以及 1.8.0_25 版本中 Java FX 的一些问题)。
  • 同样在片段中,在与主插件相同的命名空间中,我们添加了 SortedList 类的实现。每种情况的代码都是相同的,但 Java 8 的片段是用 Java 8 编译器专门编译的。最终没有必要重写 spliterator() 方法(当使用 Java 8 编译器编译时,它可以正常工作,并且仍然可以使用 1.7 编译器进行编译,因为不再引用 Spliterator 类)。

这可能不是一个理想的解决方案,但我们认为它会起作用:-)。

感谢您的意见和建议,非常感谢。