私は拡張しようとしている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のために働く一方で、操作。