1 回答

TA貢獻1963條經驗 獲得超6個贊
您不能覆蓋具有更多限制參數的方法,即T adjustInto(T temporal);不會覆蓋,Temporal adjustInto(Temporal temporal);因為參數類型T比Temporal. 所以你現在有兩個同名的方法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> & Temporalwhich 被擦除Object(通常,此類知識僅在您需要與 pre-Generics 代碼兼容時才相關)。
但是,根本問題仍然存在,adjustInto(T temporal);不會覆蓋adjustInto(Temporal temporal);作為T更具限制性的參數,因此現在接口不再是功能接口,因為它有兩個抽象方法。
的子接口TemporalAdjuster必須提供其所有操作,包括adjustInto接受 any 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操作,而它通過即時轉換而不是強制轉換來適用于其他時間。
添加回答
舉報