1 回答

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
您不能覆蓋具有更多限制參數(shù)的方法,即T adjustInto(T temporal);不會(huì)覆蓋,Temporal adjustInto(Temporal temporal);因?yàn)閰?shù)類型T比Temporal. 所以你現(xiàn)在有兩個(gè)同名的方法adjustInto,但由于類型擦除,參數(shù)類型在字節(jié)碼級(jí)別是相同的,因?yàn)門 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(通常,此類知識(shí)僅在您需要與 pre-Generics 代碼兼容時(shí)才相關(guān))。
但是,根本問題仍然存在,adjustInto(T temporal);不會(huì)覆蓋adjustInto(Temporal temporal);作為T更具限制性的參數(shù),因此現(xiàn)在接口不再是功能接口,因?yàn)樗袃蓚€(gè)抽象方法。
的子接口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);
}
然而,這種包裝的調(diào)整器不能確保正確的參數(shù),只能隱藏在運(yùn)行時(shí)仍然可能失敗的類型轉(zhuǎn)換。但看起來您正在嘗試解決一個(gè)不存在的問題,因?yàn)槟梢院唵蔚厥褂脀ith時(shí)間上的方法來獲得類型安全的操作,例如
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);
這比你的包裝器更強(qiáng)大,就像你做的那樣,例如
TemporalAdjuster a = TemporalAdjusters.ofDateAdjuster(date -> date.plusDays(1));
ZonedDateTime zoned1 = ZonedDateTime.now(), zoned2 = zoned1.with(a);
就操作而言,您只定義一次LocalDate操作,而它通過即時(shí)轉(zhuǎn)換而不是強(qiáng)制轉(zhuǎn)換來適用于其他時(shí)間。
添加回答
舉報(bào)