亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將非通用接口擴展為通用接口?

如何將非通用接口擴展為通用接口?

UYOU 2021-08-19 21:38:28
我試圖擴展,TemporalAdjuster這樣一個看起來像,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);}
查看完整描述

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操作,而它通過即時轉換而不是強制轉換來適用于其他時間。


查看完整回答
反對 回復 2021-08-19
  • 1 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號