どのように私は一般的なものに非汎用インタフェースを拡張することができますか?

ジンクォン:

私は拡張しようとしているTemporalAdjusterので、1人のルックスが好きなこと

public interface TypedTemporalAdjuster<T extends Temporal & Comparable<? super T>> {

    T adjustInto(T temporal);
}

私は、直接ベースインタフェースを拡張しようとしたとき、

public interface TypedTemporalAdjuster<T extends Temporal & Comparable<? super T>>
        extends TemporalAdjuster {

    T adjustInto(T temporal);
}

私はエラーを得ました。

... Javaの:名前の衝突は:...同じ消去を持って、まだどちらも他を上書きしません

これを実行する方法はありますか?

これまでのところ、私がやりました。

public interface TypedTemporalAdjuster<T extends Temporal & Comparable<? super T>> { //extends TemporalAdjuster {

    static <T extends Temporal & Comparable<? super T>> TypedTemporalAdjuster<T> of(
            final Class<T> temporalClass, final TemporalAdjuster temporalAdjuster) {
        return temporal -> temporalClass.cast(temporalAdjuster.adjustInto(temporalClass.cast(temporal)));
    }

    T adjustInto(T temporal);
}
ホルガー:

あなたはすなわち、より制限のパラメータでメソッドをオーバーライドすることはできませんT adjustInto(T temporal);オーバーライドしないTemporal adjustInto(Temporal temporal);パラメータの型としてTよりも制限されますTemporalあなたが名前を持つ2つのメソッドを持っているのでadjustInto、今、しかし、型消去のために、パラメータの種類はとして、バイトコードレベルで同一であるT extends Temporal & Comparable<? super T>に消去されますTemporal

あなたはに宣言を変更することでこれを修正でき

public interface TypedTemporalAdjuster<T extends Comparable<? super T> & Temporal>
extends TemporalAdjuster {
    T adjustInto(T temporal);
}

その後、同様に、意味的に同じではT extends Comparable<? super T> & Temporalに消去されますComparable代わりにTemporalまた、使用することができますT extends Object & Comparable<? super T> & Temporalに消去されますこれObject(あなたは事前にジェネリックコードとの互換性を必要とするとき、通常は、そのような知識は唯一の関連性があります)。

しかし、根本的な問題が残るが、adjustInto(T temporal);オーバーライドしないadjustInto(Temporal temporal);ようにすることはT、より限定的なパラメータであり、それは2つの抽象メソッドを持っているように、今、インターフェースは、もはや機能的インタフェースではありません。

サブインタフェースがTemporalAdjuster含む、そのoperatationの全てを提供しなければならないadjustInto任意受け入れますTemporalだから、のみ行うことができます

public interface TypedTemporalAdjuster<T extends Temporal & Comparable<? super T>>
extends TemporalAdjuster {

    static <T extends Temporal & Comparable<? super T>> TypedTemporalAdjuster<T> of(
            final Class<T> temporalClass, final TemporalAdjuster temporalAdjuster) {
        return temporal -> temporalClass.cast(temporalAdjuster.adjustInto(temporal));
    }

    @Override T adjustInto(Temporal temporal);
}

しかし、そのようなラップ調整は正しい引数を確保し、静止画のみ、実行時に失敗する可能性が型キャストを隠すことができません。あなたは、単に使用することができるよう、あなたが、ここに存在しない問題を解決しようとしているように見えますが、それはwithタイプ安全な動作を得るために、時間的に方法を例えば、

TemporalAdjuster a = TemporalAdjusters.lastDayOfMonth();

LocalDate     date1     = LocalDate.now(),     date2     = date1.with(a);
LocalDateTime dateTime1 = LocalDateTime.now(), dateTime2 = dateTime1.with(a);
ZonedDateTime zoned1    = ZonedDateTime.now(), zoned2    = zoned1.with(a);

それはあなたが行うとき、例えばとして、あなたのラッパーよりもさらに強力です

TemporalAdjuster a = TemporalAdjusters.ofDateAdjuster(date -> date.plusDays(1));

ZonedDateTime zoned1 = ZonedDateTime.now(), zoned2 = zoned1.with(a);

あなたは、という点で、一度だけの動作を定義しLocalDate、それはオンザフライそれらを変換するのではなく、鋳造することにより、他のtemporalsのために働く一方で、操作。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=185438&siteId=1