13

Java 1.8.0_25 がリリースされた後、興味深い状況が発生しました... 私の問題の根本は、主にインターフェイス内の「デフォルト」実装の新しい (1.8 への) 機能に関連していると思います。

私が取り組んでいるアプリケーションは現在 1.7 をターゲットにしており、これまではうまく機能していました。ユーザーが 1.8 への更新を開始するまで。ユーザーが 1.8 への更新を開始したので、1.8 サポートへの移行を余儀なくされています。

ほとんどの問題 (主に JavaFX パッケージの 1.7 から 1.8 への変更に関連するもの) は修正されましたが、厄介な問題が 1 つ残っています。

私の知恵、またはその欠如で、私は、しばらく前に、AbstractList<T> から拡張された SortedList<T> を作成することにしました。これまで、このクラスは問題なく動作していましたが、1.8 ランタイムで実行すると、次のようになります。

Duplicate methods named spliterator with the parameters () and () are inherited 
from the types Collection<T> and Iterable<T>

これは、AbstractList<T> によって実装される一部のインターフェイスの「デフォルト」実装が原因のようです (私の SortedList<T> クラスは、Serializable 以外の追加のインターフェイスを実装していません)。SortedList<T> オブジェクトの逆シリアル化をサポートする必要があるため、Serializable の実装は別の問題です。それを回避する方法はありません!)。

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) 

SortedList<T> の spliterator() メソッドをオーバーライドしたので、このエラーは明らかです。java.util.Spliterator を含める必要がありますが、1.7 には存在しません。

理想的には、お客様が望まない場合は、Java 1.8 への更新を要求しないようにしたいと考えています。

私たちの手はここで強制されていますか?ユーザーに 1.8 への更新を強制し、1.8 に更新したすべてのユーザーに新しいバージョンをロールアウトする必要がありますか?

この問題を回避する方法を知っている人はいますか?

より哲学的な注意として、なぜ Interface は実装で壊れているのですか :-(。気の利いた新機能かもしれませんが、特にリストのような基本的なもので、既存のコードに重大な変更をもたらすようなことは避けるべきでした/コレクションなど

この苦境に関するヘルプや提案は大歓迎です。

乾杯、

マーク

4

3 に答える 3

0

spliterator() を優先動作定義でオーバーライドする抽象クラスを作成してみてください。

abstract class Java8_AbstractCollection<E> extends AbstractCollection<E> {

    /* (non-Javadoc)
     * @see java.util.Collection#spliterator()
     */
    public Spliterator<E> spliterator() {
        return (Spliterator<E>) super.spliterator();
    }
}
于 2015-09-14T11:35:19.840 に答える